Python入门学习笔记————13(继承,多态,类相关函数)

#父类

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

猜你喜欢

转载自blog.csdn.net/weixin_42492218/article/details/85336885