#父类

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):
 
=name
 
def swim(self):
 
print('swimming...')
 
 
class Bird ():
 
def __init__(self,name):
 
 = name
 
def fly(self):
 
print('flying...')
 
 
class Person ():
 
def __init__(self,name):
 
 = name
 
def work(self):
 
print('working...')
 
 
 
class Superman (Fish,Bird,Person):#有顺序
 
def __init__(self,name):
 
 = name
 
 
 
s = Superman('goudan')
 
s.swim()
 
s.fly()
 
s.work()
 
 
#单继承的例子
 
class Student(Person):
 
def __init__(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):
 
 = '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]:

 

#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__']