面向对象之继承
1、继承的好处
# 节省代码
# 提高效率
# 让类之间产生关联。
示例:
class Animal: def __init__(self, kind, age, sex): self.kind = kind self.age = age self.sex = sex class Person(Animal): pass class Dog(Animal): pass class Cat(Animal): pass p1 = Person('黄色人种', 25, '男') print(p1.__dict__)
2、继承的分类
如上:
# Animal 父类,基类
# Person 子类,派生类
# 继承:单继承,多继承。
# 类:经典类,新式类
# 经典类:不继承object的类。
# 新式类: 继承object的类。
# python2x 经典类 新式类(object) 共存。#了解 新式类需要在类名后面加上(object)
# python3x 默认继承object 全部都是新式类。
区别在于:多继承的时候,查询的顺序不同。新式类比经典类查询效率要高。
class A:
pass
a1 =A()
会报错吗?我这个对象必须要找到__init__方法。
答案是不报错。这个是因为python3用的都是新式类。其实所有类都继承object类。点击去object类找到__init__方法。
2.1 单继承
class Animal: a1 = '太白' def __init__(self, kind, age, sex): self.kind = kind self.age = age self.sex = sex def func1(self): print(666) class Person(Animal): # a1 = 'alex' pass # 类名 print(Person.a1) # Person.func1(123) 一般类名不调用方法
需求:子类有自己的属性,我如何既要执行父类的属性或方法,又要执行子类或方法。
class Animal: def __init__(self, kind, age, sex): self.kind = kind self.age = age self.sex = sex def bark(self): print('动物都会叫') class Dog(Animal): #Animal去掉也能执行。 def __init__(self, k1,a1,s1,bite): ''' self = d1 k1 = '藏獒' .... ''' # Animal.__init__(self, k1, a1, s1) #第一种: Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法
super().__init__(k1,a1,s1) #第二种:自动将self传给父类的self,不用你自己传了 self.bite = bite def bark(self): print('汪汪汪') class Cat(Animal): def bark(self): print('喵喵喵') class chick(Animal): def bark(self): print('大爷,来玩呀') d1 = Dog('藏獒', 3, '公', 300) print(d1.__dict__)
两种解决方式解决既要执行子类的方法,又要执行父类的方法
第一种 Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法
第二种:super().__init__(k1,a1,s1) # 自动将self传给父类的self
d1.bark()
先执行父类,在执行子类。
发现都执行了。
完整版:
#需求:子类有自己的属性,我如何既要执行父类的属性或方法,又要执行子类或方法。 class Animal: def __init__(self,kind,age,sex): self.kind = kind self.age = age self.sex = sex def bark(self): print('动物都会叫') class Dog(Animal): def __init__(self,k1,a1,s1,bite2): # Animal.__init__(self,k1,a1,s1) super().__init__(k1,a1,s1) self.bite = bite2 #增加咬合力的属性 def bark(self): super().bark() print('汪汪汪') class Cat(Animal): def __init__(self,k1,a1,s1,bite): # Animal.__init__(self,k1,a1,s1) #第一种: Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法 super().__init__(k1,a1,s1) #第二种:自动将self传给父类的self,不用你自己传了 self.bite = bite #增加咬合力的属性 def bark(self): super().bark() print('喵喵喵') class chick(Animal): def __init__(self,k1,a1,s1,bite3): Animal.__init__(self,k1,a1,s1) self.bite = bite3 #增加咬合力的属性 def bark(self): super().bark() print('大爷,来玩呀') d1 = Dog('藏獒',3,'公',300) print(d1.__dict__) d1.bark() c1 = Cat('咪咪',2,'母',50) print(c1.__dict__) c1.bark() c2 = chick('公鸡',1,'公',20) print(c2.__dict__) c2.bark()
2.2、多继承
# 新式类:C3算法 mro 主要是查询 新式类的多继承的继承顺顺序
通过mro查看继承顺序
class A: def func(self): print(666) pass class B: def func(self): print(666) pass class C(A): def func(self): print(666) pass class D(B): def func(self): print(666) pass class E(C,D): # def func(self): # print(666) pass # e1 = E() e1.func() print(E.mro())
单继承其他示例:
# 单继承 class A: name = 'alex' def func(self): print('IN A') class B(A): name = '太白' def func(self): # self = obj A.func(self) #IN A # print('IN b') super().func() #IN A obj = B() # obj.name obj.func()
作者:wangkaiok —— 小菜鸟111
出处:http://www.cnblogs.com/wangkaiok/
本文版权归作者和博客园共有,但未经作者同意禁止转载,转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。