回顾:
多继承:可以继承多个父类
优点:子类可以同时遗传多个父类的属性,最大限度地重用代码
缺点:
1、违背人的思维习惯:继承表达的是一种什么"是"什么的关系
2、代码可读性会变差
3、不建议使用多继承,有可能会引发可恶的菱形问题,扩展性变差,
如果真的涉及到一个子类不可避免地要重用多个父类的属性,应该使用Mixins
多继承的正确打开方式:mixins机制
mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性
ps:让多继承满足人的思维习惯表达什么"是"什么(补充:通常Mixin结果的类放在左边)
class Vehicle: pass class FlyableMixin: def fly(self): pass class CivilAircraft(FlyableMixin,Vehicle): # 民航飞机 pass class Helicopter(FlyableMixin,Vehicle): # 直升飞机 pass class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了 pass
在子类派生的新方法中如何重用父类的功能
方式一:指名道姓调用某一个类下的函数 不依赖于继承关系
class OldboyPeople: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def f1(self): print('%s say hello' %self.name) class Teacher(OldboyPeople): def __init__(self,name,age,sex,level,salary): OldboyPeople.__init__(self,name,age,sex) self.level = level self.salary=salary tea_obj=Teacher('egon',18,'male',10,3000) print(tea_obj.__dict__)
方式二:super()调用父类提供给自己的方法=》严格依赖继承关系
调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro,去当前类的父类中找属性
class A: def test(self): print('from A') super().test() class B: def test(self): print('from B') class C(A,B): pass obj=C() obj.test() print(C.mro())
1、什么多态:同一事物有多种形态
class Animal: pass class People(Animal): pass class Dog(Animal): pass class Pig(Animal): pass
2、为何要有多态=》多态会带来什么样的特性,多态性
多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象
class Animal: # 统一所有子类的方法 def say(self): print('动物基本的发声频率。。。',end=' ') class People(Animal): def say(self): super().say() print('嘤嘤嘤嘤嘤嘤嘤') class Dog(Animal): def say(self): super().say() print('汪汪汪') class Pig(Animal): def say(self): super().say() print('哼哼哼') obj1=People() obj2=Dog() obj3=Pig() obj1.say() obj2.say() obj3.say()
python推崇的是鸭子类型
class Cpu: def read(self): print('cpu read') def write(self): print('cpu write') class Mem: def read(self): print('mem read') def write(self): print('mem write') class Txt: def read(self): print('txt read') def write(self): print('txt write') obj1=Cpu() obj2=Mem() obj3=Txt() obj1.read() obj1.write() obj2.read() obj2.write() obj3.read() obj3.write()
补充的内置函数
# zip v1 = 'hello' v2 = [111, 222, 333, 444, 5555, 6666] res = zip(v1, v2) print(list(res)) # divmod print(divmod(10000, 33)) # (303, 1) # dir class Foo: pass obj = Foo() obj.xxx = 1111 print(dir(obj)) # obj.哪些属性 # enumerate for i, v in enumerate(['a', 'b', 'c']): print(i, v) # eval res = eval('{"a":1}') # 执行字符串中的表达式 print(res, type(res)) # isinstance class Foo: pass obj = Foo() print(isinstance(obj, Foo)) print(isinstance([], list)) # 类型判断推荐使用isinstance print(type([]) is list) # 不推荐使用 # __import__ time = __import__('time') time.sleep(3)