Python中super的用法(新式类与经典类(旧式类)的区别)

       楼主初学Python一星期,在书上遇到一个super的问题,便开始找寻python  super相关的资料,楼主吧网上关于super的代码复制到编辑器里运行,结果出来TypeError: super() argument 1 must be type, not classobj。如上的错误,楼主又开始找寻这个错误相关的资料,发现基本上的资料都是直接告诉我————在python2.2版本之前,直接调用超类的方法,后来改成通过super来调用,原因是为了解决多重继承中的钻石形状问题。Python里的super只能用在新式类中,不能用于以前的经典类,如果基类是经典类则会出现这个错误。解决的方法是FatherClass只要有一个超类是Object就OK了。当时我就很蒙蔽,于是再次寻找新式类与经典类的区别。经过自己敲代码终于有所悟。

      首先区分新式类与经典类的区别,经典类即在没有父类的情况下直接写成class A,而新式类则必须写成class A(object),其中(object)有否是区别新式类与经典类的关键,而super执行时必须为新式类。如果你缺少了(object),则class A就变成了经典类而无法初始化super,从而会产生报错TypeError: super() argument 1 must be type, not classobj。接下来是两段简单的代码理解新式类与经典类的区别。同时你可以把代码2中的第一条语句class A(object):改成class A:再运行下看看会不会报错。我想这能更好的帮助你理解新式类与经典类的区别同时更好的使用super。

代码1:

class A:
    def __init__(self):
        print("Enter A")
        print("Leave A")

class B(A):
    def __init__(self):
        print("Enter B")
        A.__init__(self)
        print("Leave B")

class C(A):
    def __init__(self):
        print("Enter C")
        A.__init__(self)
        print("Leave C")

class D(A):
    def __init__(self):
        print("Enter D")
        A.__init__(self)
        print("Leave D")

class E(B, C, D):
    def __init__(self):
        print("Enter E")
        B.__init__(self)
        C.__init__(self)
        D.__init__(self)
        print("Leave E")
        
E()

很显然,代码1的运行结果为

Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E

改代码为逐语句执行所给代码,及深度优先搜索。公共父类A被多次执行。



代码2:

class A(object):
    def __init__(self):
        print("Enter A")
        print("Leave A")

class B(A):
    def __init__(self):
        print("Enter B")
        super(B, self).__init__()
        print("Leave B")

class C(A):
    def __init__(self):
        print("Enter C")
        super(C, self).__init__()
        print("Leave C")

class D(A):
    def __init__(self):
        print("Enter D")
        super(D, self).__init__()
        print("Leave D")

class E(B, C, D):
    def __init__(self):
        print("Enter E")
        super(E, self).__init__()
        print("Leave E")

E()


代码2的运行结果为:

Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E

采用的是广度优先搜索,即在遇到super(E, self).__init__()是直接桉序进入B,C,D,而不是进入B之后吧B执行完了再退回来执行C,因此在进入B,C,D后三个类都要执行公共父类A,三者所做的事情是一样的,所以父类A只被执行一次。因此获得如上结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值