'''super()其实是builtins内置模块提供的函数,具体可help(super)查看
int float list tuple dict都是类型对象
'''
class B:
def meth(self):
print("execute B::meth(self)")
@classmethod
def cmeth(cls):
print("execute B::cmeth(cls)")
class C(B):
def meth(self):
print("super() in executing C::meth(self): ", super())
#打印:<super: <class 'C'>, <C object>>
super().meth() #调用父类同名实例方法
print("name '__class__' in 实例方法:", __class__)
'''5、打印<class '__main__.C'>, 继承自object基类的实例属性__class__可以不用
实例对象去引用(self.__class__)就能直接访问,但自定义的实例属性必须用实例
对象去引用'''
super(self.__class__, self).meth() #显式调用super()函数,调用父类同名实例方法
'''4、super()方法的方法签名是super(__class__, object),形参__class__是想要求
父类的子类类型对象,形参object是子类的一个实例对象'''
'''6、方法super()可以在实例方法或类方法中调用,在实例方法中调用返回实例对象中
基类部分,就是基类实例对象。在类方法中调用super()返回基类类型对象,如下
'''
@classmethod
def cmeth(cls, obj):
'''1、这里类方法中增加一个实例对象形参是为了作方法super()的第二个位置实参'''
print("super() in executing C::cmeth(cls): ", super())
#打印:<super: <class 'C'>, <C object>>
print("name '__class__' in 类方法:", __class__) #打印:<class '__main__.C'>
super(__class__, obj).cmeth() #显式调用super()函数,调用父类同名类方法
super(cls, obj).cmeth() #显式调用super()函数,调用父类同名类方法
obj = C()
obj.meth()
print('obj.__class__:', obj.__class__)#实例对象的类型属性__class__就是实例的类
#打印输出:<class '__main__.C'>
print('C.__class__:', C.__class__) #类型对象的类型属性__class__就是类型类
#打印输出:C.__class__: <class 'type'>
C.cmeth(obj)
python3.8编译输出:
haypin@ubt:~/Files$ python3.8 m07303.py
super() in executing C::meth(self): <super: <class 'C'>, <C object>>
execute B::meth(self)
name '__class__' in 实例方法: <class '__main__.C'>
execute B::meth(self)
obj.__class__: <class '__main__.C'>
C.__class__: <class 'type'>
super() in executing C::cmeth(cls): <super: <class 'C'>, <C object>>
name '__class__' in 类方法: <class '__main__.C'>
execute B::cmeth(cls)
execute B::cmeth(cls)
haypin@ubt:~/Files$
super(type, obj),可以看作是"传入派生类type与派生类实例对象obj,返回obj的基类部分,也就是基类实例对象",因而执行"super(type, obj).基类object的实例方法()"会执行默认地self形参绑定而不必手动传入,但使用基类类型对象object执行"object.基类object的实例方法(obj)"时由于不会形参绑定,因此必须手动传入self实参。并且,这里传入派生类的实例对象obj也没关系,python解释器会进行obj的类型属性__class__的修改。