#父类
class A ():
pass
class B (A):
pass
print(A.__mro__)
print(B.__mro__)
(<class '__main__.A'>, <class 'object'>) (<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
单继承和多继承
- 单继承:每个类只能继承一个类
- 多继承:每个类允许继承多个类
单继承和多继承的优缺点
- 单继承:
- 传承有序逻辑清晰语法简单隐患少
- 功能不能无限扩展,只能在当前唯一继承链中扩展
- 多继承:
- 类的功能扩展方便
- 继承关系混乱
In [14]:
#多继承实例
class Fish():
def __init__(self,name):
self.name=name
def swim(self):
print('swimming...')
class Bird ():
def __init__(self,name):
self.name = name
def fly(self):
print('flying...')
class Person ():
def __init__(self,name):
self.name = name
def work(self):
print('working...')
class Superman (Fish,Bird,Person):#有顺序
def __init__(self,name):
self.name = name
s = Superman('goudan')
s.swim()
s.fly()
s.work()
#单继承的例子
class Student(Person):
def __init__(self,name):
self.name = name
t = Student('pidan')
t.work()
swimming... flying... working... working...
菱形继承/钻石继承
- 多个子类继承自同一个父类,这些子类又被同一个类继承,于是继承关系图形成一个菱形
- 关于多继承的MRO
- MRO就是多继承中用于保存继承顺序的一个列表
- Python本身采用c3算法来对多继承的菱形继承进行计算结果
- MRO列表的计算原则:
- 子类永远再父类前
- 如果多个父类,则根据继承语法中括号内类的书写顺序存放
- 如果多个类继承了同一个父类,孙子类中只会选取继承语法括号中的第一个父类的父类
In [16]:
#菱形继承问题
class A ():
pass
class B (A):
pass
class C (A):
pass
class D (B,C):
pass
构造函数
- 在对象进行实例化的时候,系统自动调用的一个函数叫做构造函数,通常此函数用来对实例对象进行初始化
In [18]:
#构造函数例子
class Person ():
#对Person类进行实例化的时候
#姓名确定
#年龄确定
def __init__ (self):
self.name = 'goudan'
self.age = 18
self.address = 'where'
print ('hello word!')
p = Person()
hello word!
In [21]:
#对构造函数进行扩展
class A ():
def __init__(self,name):
print('A')
print(name)
class B (A):
def __init__(self,name):
A.__init__(self,name) #调用父类的构造函数
print('我是B')#增加自己的构造函数
b = B('hello') #结构需要相符
A hello 我是B
多态
- 多态就是同一个对象在不同的情况有不同的状态
- 多态不是语法,是一种设计思想
- 多态性: 一种调用方式,不同执行效果
- 多态: 同一事物的多种形态,动物分为人类,狗,等
Mixin设计模式
- 主要采用多继承方式对类的功能进行扩展
- 我们使用多继承语法实现Mixin
- 使用Mixin实现多继承的时候要非常小心
- 首先必须表示某一单一功能,而不是某个物品
- 职责必须单一,如果有多个功能,则写多个Mixin
- Mixin不能依赖于子类的实现
- 子类即使没有继承这个Mixin类,也能照样工作,只是缺少了某各功能
- 优点
- 使用Mixin可以在不对类进行任何修改的情况下扩充功能
- 可以方便的组织维护不同功能组件的划分
- 可以根据需要任意调整功能类的组合
- 可以避免创建很多新的类,导致类的继承混乱
In [39]:
扫描二维码关注公众号,回复:
4709798 查看本文章
#Mixin案例
class Person ():
name = 'haha'
age = 18
def eat (self):
print('eating')
def sleep (self):
print('sleeping')
class Student(Person):
def study (self):
print('studying')
class Teacher (Person):
def work (self):
print('working')
class Tutor(Teacher,Student):
pass
t = Tutor()
print(Tutor.__mro__) #MRO列表 多继承
print(t.__dict__)#实例
print(Tutor.__dict__)
print('*'*50)
class TeacherMixin ():
def work (self):
print('work')
class StudentMixin():
def study (self):
print('study')
class TutorM(Person,StudentMixin,TeacherMixin):
pass
t = TutorM()
print(TutorM.__mro__) #MRO列表 多继承
print(t.__dict__)#实例
print(TutorM.__dict__)
(<class '__main__.Tutor'>, <class '__main__.Teacher'>, <class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>) {} {'__module__': '__main__', '__doc__': None} ************************************************** (<class '__main__.TutorM'>, <class '__main__.Person'>, <class '__main__.StudentMixin'>, <class '__main__.TeacherMixin'>, <class 'object'>) {} {'__module__': '__main__', '__doc__': None}
类相关函数
- issubclass:检测一个类是否是另一个类的子类
- isinstance:检测一个对象是否是一个类的实例
- hasattr:检测一个对象是否有成员XXX
- gettattr、setattr、delattr等用法相同
- dir: 获取对象成员列表
In [48]:
#issubclass
class A ():
pass
class B (A):
pass
class C ():
pass
print(issubclass(B,A))
print(issubclass(C,A))
#isinstance
class A ():
pass
a = A()
print(isinstance(a,A))
print(isinstance(A,A))
#hasattr
class A():
name = 'Noname'
a = A()
print(hasattr(a,'name'))
print(hasattr(a,'age'))
True False True False True False
In [51]:
#dir
class A ():
pass
dir(A)
Out[51]:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']