继承:
class Animal:
breath = ‘呼吸’
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self):
print(“动物都需要进食”)
class Person(Animal): #括号里面的是父类,括号外面的是子类
pass
class Cat():
pass
p1 = Person('alex','laddyboy',1000)
print(p1.__dict__)
#初识继承:子类以及子类实例化的对象,可以访问父类的任何方法或变量。
类名可以访问父类所有内容
print(Person.breath) #用类名去访问父类的变量
Person.eat(111) #用类名去访问父类的方法
子类实例化的对象也可以访问父类所有内容
print(p1.breath)
p1.eat()
#查询顺序
先从本类中找,如果找不到,就通过指针去父类中找。
#只执行父类的方法:子类中不要定义与父类同名的方法
只执行子类的方法:在子类创建这个方法
既要执行子类的方法,又要执行父类的方法,有两种解决方式
1.
class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def eat(self,a1):
print('%s吃%s东西' % (self.name,a1))
def eat(self):
print('%s喝东西' % *(self.name))
class Bird(Animal):
def __init__(self,name,sex,age,wing):#self接收的是b1对象,nama接收的是鹦鹉,sex接收的是公,age接收的是20,wing接 收的是绿翅膀
“相当于在函数体定义了这几个变量,name:鹦鹉,sex:公,age:20,wing
Animal.__init__(self,name,sex,age) #类名调用方法需要self;借助Bird的init函数, 将 name,sex,age等参数传递给了父类的name,sex,age等参 数,name:鹦鹉, sex:公,age:20,自动执行父类的init函数,给b1这个对象封装 了3个属性,也 以 用下列代码代替super().__init__(name,sex,age)
self.wing = wing 在自己本类定义了wing属性
def bark(self):
print(‘嗷嗷叫’)
def eat(self,argv):
super().eat(argv)
print("鸟吃虫子...”)
b1 = Bird(‘鹦鹉’,‘公’,20,‘绿翅膀’)
#既要执行父类的eat方法,也要执行子类的eat方法
b1.eat('金蝉') #鹦鹉吃金蝉
继承的进阶
继承:单继承,多继承,
类:经典类,新式类
新式类:凡是继承object的类都是新式类,python3版本所有的类都是新式类,都默认继承object类
经典类:凡是不继承object的类都是经典类,,python2版本所有的类都是经典类。
单继承:新式类,经典类查询顺序一样。先执行自己类中的,如果自己类中没有,在去继承继承类中的内容。
多继承:新式类:查询顺序遵循广度优先,经典类遵循深度优先。
下面为广度优先顺序:钻石继承,遵循的是每个结点有且只走一次。
下面的12345是查找的顺序。
广度优先:一条路走到倒数第2级,判断,如果其他路能走到终点,则返回走另一条路,如果不能,则走到终点。
深度优先,广度优先:只能是继承两个类的情况。