【Python】基础之面向对象

第四章 Python 面向对象



前言

上三篇了解了基础的数据类型以及代码块、注释等语法, 讲判断、运算、循环、lamda、函数等基础语法,==这一篇讲面向对象==

一、对象/类

1.创建对象/类

类就是对象,对象就是类

同java一样

类也是用class标识
类中的构造函数是 __init__() 注意是双下划线
所有类都有一个名为 __init__() 的函数,它始终在启动类时执行。 使用 __init__() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作:

class user:
	def __init__(self, a, b):
		self.a=a
		self.b=b
		self.c=a
		self.d=b
		print("我创建了个类",self)
		
	## 这个自定义的方法,第一个参数永远是对象本身,作用是用于访问本身的成员变量,但他不需要命名为self
	def myf(a,b):
		print(a.a,b)
x=user('1','2')

print(x.a,x.b,x.c,x.d)

x.myf(False)
	

在这里插入图片描述

2.修改类的属性

修改属性就像js一样 直接赋值就行

class user:
	def __init__(self, a, b):
		self.a=a
		self.b=b
		self.c=a
		self.d=b
		print("我创建了个类",self)
		
	## 这个自定义的方法,第一个参数永远是对象本身,作用是用于访问本身的成员变量,但他不需要命名为self
	def myf(a,b):
		print(a.a,b)
x=user('1','2')

print(x.a,x.b,x.c,x.d)

x.myf(False)

x.a=9
print(x.a,x.b,x.c,x.d)

在这里插入图片描述

3.删除属性/删除类/pass关键字

删除属性/删除类

del x.a
del x

pass关键字
类不允许为空,如果有需要,可以用pass跳过限制 例如 子类完全继承父类

class User:
	pass

class Father:
	def __init__(a,b,c):
		a.a=b+c
	def pt(a):
		print(a.a)
		
class Son(Father):
	pass

x=Son(1,1)
x.pt()
		
	

在这里插入图片描述

二、继承

继承就是子类继承父类的属性/方法,但是并不意味着子类继承父类之后就无法添加自己的方法和属性了


class Father:
	def __init__(a,b,c):
		a.a=b+c
	def pt(a):
		print(a.a)
		
class Son(Father):
	## 子类可以覆盖继承父类的方法
	def pt(a):
		print(int(a.a)+5)
	def mypt(a):
		super().pt()
		## 等同于 Father.pt()		
class LittleSon(Father):
	# 这样可以完全继承
	pass
x=Son(1,1)
y=LittleSon(1,1)
x.mypt()
x.pt()
y.pt()

在这里插入图片描述

三、多态

“多态”(polymorphism)一词意为“多种形式”,在编程中,它指的是可以在许多对象或类上执行的具有相同名称的方法/函数/操作符。

类多态

多态经常在类方法中使用,我们可以在其中有多个具有相同方法名的类。

例如,假设我们有三个类:Car、Boat 和 Plane,并且它们都有一个名为 move() 的方法:

# car 类
class Car:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model
# car类的move方法
  def move(self):
    print("Drive!")
# boat类
class Boat:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model
# boat类的move方法
  def move(self):
    print("Sail!")
# plane类
class Plane:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

# plane类的move方法
  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang")       #Create a Car class
boat1 = Boat("Ibiza", "Touring 20") #Create a Boat class
plane1 = Plane("Boeing", "747")     #Create a Plane class

#依次调用各个类的move方法
for x in (car1, boat1, plane1):
  x.move()

继承类多态
那么具有相同名称的子类的类呢?我们可以在那里使用多态吗?

可以。如果我们使用上面的例子并创建一个名为 Vehicle 的父类,并使 Car、Boat、Plane 成为 Vehicle 的子类,则子类将继承 Vehicle 的方法,但可以覆盖它们:

实例
创建一个名为 Vehicle 的类,并使 Car、Boat、Plane 成为 Vehicle 的子类:

class Vehicle:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Move!")

class Car(Vehicle):
  pass

class Boat(Vehicle):
  def move(self):
    print("Sail!")

class Plane(Vehicle):
  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang") # 创建 Car 对象
boat1 = Boat("Ibiza", "Touring 20") # 创建 Boat 对象
plane1 = Plane("Boeing", "747") # 创建 Plane 对象

for x in (car1, boat1, plane1):
  print(x.brand)
  print(x.model)
  x.move()

子类从父类继承属性和方法。

在上面的例子中,您可以看到 Car 类是空的,但它从 Vehicle 继承了 brand、model 和 move()。

Boat 和 Plane 类也从 Vehicle 继承了 brand、model 和 move(),但它们都覆盖了 move() 方法。

由于多态性,我们可以为所有类执行相同的方法。

四、迭代

迭代就像一种循环一样
有编程基础可能会好理解一点

迭代器是一种对象,该对象包含值的可计数数字。

迭代器是可迭代的对象,这意味着您可以遍历所有值。

从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,它包含方法 iter() 和 next()。

字符串、列表、元组、字典和集合都是可迭代的对象。它们是可迭代的容器,您可以从中获取迭代器(Iterator)。

字符串可以看作是字符的数组

所有这些对象都有用于获取迭代器的 iter() 方法:

mystr = "banana"
mylist=['1','2','3']
mytuple=('1','2','3')
mydiction={"a":"1","b":"2","c":"3"}
myset={"1","2","3"}

#for循环本质就是遍历了迭代器
for x in mystr:
  print(x)
## 等同于
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

创建迭代器

自建迭代器呢 需要在类中实现__iter__()方法 和__next__()方法

StopIteration关键字可以跳出迭代

iter() 方法允许执行操作(初始化等),但必须始终返回迭代器对象本身。

next() 方法也允许您执行操作,并且必须返回序列中的下一个项目。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
  print(x)

总结

文章总结:

天道从不酬勤,机缘是抢来的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值