Discuss / Python / 补充概念

补充概念

Topic source
元类 父类
参考1 参考2

1.元类

  • 类在生成的时候都是需要依据元类的,平时在定义类的时候没有传入metaclass参数,实际上这个参数默认使用了系统提供的元类。 class Person(object)class Person(object,metaclass='系统默认的')是等价的。当我们手动设定metaclass为自己定义的元类的时候,类的生成过程就可以被我们控制了,可以自定义一些属性,方法。
  • 参考文档

2.父类,super

  • 元类的查找是沿着继承链进行的,自身没有就去父类上找(多继承?),最终找到object还没有的话就又使用系统提供的元类了

  • 关于super。继承关系中,子类实例生成之前必须先生成父类实例。

  • 默认情况下,子类会调用父类的无参构造方法,若父类构造传入了参数,则必须在子类显式调用此方法。这里又涉及如何在子类中调用父类方法的问题:

#子类调用父类方法,途径有2中
class Person(object):
    def __init__(self,name):
        self._name = name
    def say(self):
        print('my name is %s'%self._name) 

class Stu(Person):
    def __init__(self,name,age):
        #这里必须显式调用父类构造
        # 方法一,通过 类名.method(*param)
        # 方法二,通过 super

        # Person.__init__(self,name) # 第一种方法
        super(Stu,self).__init__(name) #第二种方法
        self._age = age

    def say(self):
        super(Stu,self).say()
        print('my age is %s'%self._age) # super的方式调用父类方法

建议使用super的方式调用父类方法,因为

  • 如果父类名字变了,还要一个个去子类中改调用,这是不科学的
  • 如果出现多继承,那么子类中要使用类名调用父类构造的方式去把各个父类的__init__逐个写一遍,并且这里面还会出现顶级类的构造方法被重复调用的情况。
  • 使用super就super(ClassName,self).method(*arg,**kw)一条语句就可以,不论父类有多少个,并且顶级父类只会被调用一次
  • 具体请参考
  • 试一下<sup>5</sup> <span style='color:yellow'>文字</span>

我发现我错了,python的坑也挺深的,推荐两个链接个大家。


super与MRO Mixin与多继承


  • 1

Reply