python的super()函数与显式调用方法

 

'''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__的修改。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值