__new__/__init__/super()详解

__new__/__init__/super的用法详解

__new__讲解:

__new__称作构造方法,属于类方法,用于创建一个实例对象。必须要有返回值,如果返回的是本类的实例,则返回实例对象会自动调用__init__方法(如果定义了该方法的话),如果返回的不是本类实例,则不会调用本类的__init__方法。

class Test:
    def __init__(self):
        print("TEST __init__")

class A:

    def __new__(cls, *args, **kwargs):
        print("enter __new__")
        obj = object.__new__(cls, *args, **kwargs) # 测试1
        obj = object.__new__(Test, *args, **kwargs)  # 测试2
        print(obj, obj.__class__)
        return obj

    def __init__(self):
        print("enter __init__")
        self.n = 2

# 测试1:把测试2代码注释掉
A()
#输出:
'''
enter __new__
<__main__.A object at 0x00000000028F6668> <class '__main__.A'>
enter __init__
'''

# 测试2:把测试1代码注释掉
A()
# 输出:
'''
enter __new__
<__main__.Test object at 0x00000000028D6668> <class '__main__.Test'>
'''

super讲解:

super()主要应用在类的继承。super()返回的是根据继承树解析最近的类对象,继承树可以通过cls.mro(), 或者cls.__mro__拿到。super(fatherclass, self)可以指定从哪个类对象之后的继承树开始查找。

class A:
    def __init__(self):
        print("A.__init__")
        super().__init__()
        self.n = 2

    def add(self, m):
        print('self is {0} @A.add'.format(self))
        self.n += m


class B(A):
    def __init__(self):
        print("B.__init__")
        super().__init__()
        self.n = 3

    def add(self, m):
        print('self is {0} @B.add'.format(self))
        super().add(m)
        self.n += 3


class C(A):
    def __init__(self):
        print("C.__init__")
        super().__init__()
        self.n = 4

    def add(self, m):
        print('self is {0} @C.add'.format(self))
        super().add(m)
        self.n += 4


class D(B, C):
    def __init__(self):
        print("D.__init__")
        super().__init__()
        self.n = 5

    def add(self, m):
        print('self is {0} @D.add'.format(self))
        super().add(m)
        self.n += 5


print(D.mro())
d = D()
d.add(2)
print(d.n)

# 输出:
'''
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
D.__init__
B.__init__
C.__init__
A.__init__
self is <__main__.D object at 0x00000000028C1A90> @D.add
self is <__main__.D object at 0x00000000028C1A90> @B.add
self is <__main__.D object at 0x00000000028C1A90> @C.add
self is <__main__.D object at 0x00000000028C1A90> @A.add
19
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值