Skip to content

python的class类

python
class Person:
    def __init__(self, name):
        self.name = name

class Male(Person):
    def __init__(self, name):
        # super().__init__(name)    # 调用父类的初始化函数,本质上程序运行的时候,它会取 传入的这两个参数
        super(Male,self).__init__(name)    # 调用父类的初始化函数,  和上面那个是等价的
        # Person.__init__(self, name)    # 调用父类的初始化函数  和上面那个是等价的
        self.gender = "male"

m = Male("Tom")

super(Male, m).__init__("Tom") # super 可以在外部用, 意思就是在m的mro链上,从Male后面的那个class开始找
# 在对象m的Male后面找

tips:

  • super是一个整日八经的class,它是一个内置类的名字,super()并不是调用一个函数,而是建立一个super的对象
  • super完整版它是有两个参数的,第一个参数是type,也就是一个class,而第二个参数是一个tpye或者是一个object,
  • 其中第二个参数决定了这一个函数bind到哪一个object或者class上,
  • 同时第二个参数也决定了使用哪个mro,而第一个参数决定了在mro链上,在哪个class开始往后找

super(Male,self).init(name) 做了什么事情呢

  • 首先它要从self这个object里面拿到mro,self是一个Male的非常简单,就是 Male -> Person -> object
  • 然后它会找到Male在mro里面所处的位置,接下来,它会从Male后面的那个class开始找,那它第一个找到的就是Person
  • 然后就看Person里面有没有__init__这个函数,如果有就把__init__函数bind到Male上
  • 可以理解Person里面的self就是super里面传入的self,等价于 Person.init(self, name)

mro

全称 method resolution order(方法解析顺序) 一个class,如何在它的父类里面找,应该优先属于哪个父类的函数,这个顺序就叫mro,类似于js中的原型链 想要获取继承的优先级顺序,可以使用这类 .mro 或者 这个类的 mro() 方法,