面向对象的三大特性: 继承 多态 封装
继承的优点:1.节省代码 2.规范代码
初识继承:
子类以及子类实例化的对象 可以访问父类的任何方法或变量.
class Animal: breath = '呼吸' def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age def eat(self): print(self) print('动物都需要进食....') class Person(Animal): # 括号里面的 父类,基类,超类 括号外面的 子类,派生类. pass class Cat: pass class Dog: pass p1 = Person('alex', 'laddyboy', 1000) print(p1.__dict__) # 子类实例化的对象也可以访问父类所有内容 print(p1.breath) print(p1) p1.eat() # 类名可以访问父类所有内容 print(Person.breath) Person.eat(11)
查询顺序见下图:
定义一个Animal类,写三个类:猫,狗,鸡,,每个类中都有吃喝自己的方法
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 drink(self): print('%s喝东西' % (self.name)) class Cat(Animal): def miaow(self): print('喵喵叫') def eat(self): # 只执行自己类中的方法 print(666) class Brid(Animal): def __init__(self, name,sex,age,wing): # self b1对象 name '鹦鹉',sex '公',age 20, wing '绿翅膀' ''' self=b1对象 name='鹦鹉' sex='公' age= 20, wing='绿翅膀' ''' # Animal.__init__(self, name, sex, age) super().__init__(name,sex,age) # super(Brid,self).__init__(name,sex,age) self.wing = wing def bark (self): print('嗷嗷叫') def eat(self,argv): super().eat(argv) print('鸟吃虫子...') class Chook(Animal): def crow(self): print('大爷laiwanya') cat1 = Cat('tom','公', 3) # 只执行子类的方法:在子类创建这个方法. cat1.eat() # 只执行父类的方法:子类中不要定义与父类同名的方法 # 既要执行子类的方法,又要执行父类的方法? # 有两种解决方法. #1,Animal.__init__(self, name, sex, age) #2,super().__init__(name,sex,age) b1 = Brid('鹦鹉','公',20,'绿翅膀') print(b1.__dict__) b1.eat('金蝉')
继承的进阶
继承: 单继承,多继承.
类:经典类, 新式类
新式类:
凡是继承object类都是新式类
python3x 所有的类都是新式类,因为python3x中的类都默认继承object
经典类:
不继承object类都是经典类 #python2x:(既有新式类,又有经典类) 所有的类默认都不继承object类,
所有的类默认都是经典类.你可以让其继承object.
单继承: 新式类,经典类查询顺序一样.
多继承:
新式类: 遵循广度优先.
经典类: 遵循深度优先.
多继承的新式类
广度优先 : 一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走另一条路.如果不能,则走到终点.
class A: def func(self): print('IN A') class B(A): pass # def func(self): # print('IN B') class C(A): pass # def func(self): # print('IN C') class D(B): pass # def func(self): # print('IN D') class E(C): pass # def func(self): # print('IN E') class F(D,E): pass # def func(self): # print('IN F') f1 = F() f1.func()
查询顺序:
print(F.mro()) # 查询类的继承顺序
多继承的经典类 深度优先 : 一条路走到底.