python为什么运行不了类_关于python:为什么不自动调用超类__init__方法?
为什么Python设计人员为什么决定子类的__init__()方法不像其他某些语言那样自动调用其超类的__init__()方法? Pythonic和推荐的习语真的像下面这样吗?
class Superclass(object):
def __init__(self):
print 'Do something'
class Subclass(Superclass):
def __init__(self):
super(Subclass, self).__init__()
print 'Do something else'
您可以编写装饰器以继承__init__方法,甚至可以自动搜索子类并装饰它们。
@osa,听起来真的是个好主意。 您想在装饰器部分做更多描述吗?
@osa是的描述更多!
Python的__init__与其他语言的构造函数之间的关键区别是__init__不是构造函数:它是一个初始化程序(实际的构造函数(如果有,但是请参阅下文;-)是__new__,并且再次完全不同地工作)。尽管构造所有超类(毫无疑问,在继续向下构造之前),这显然是在说您正在构造子类的实例,显然不是初始化的情况,因为存在许多用例,超类的初始化需要被跳过,更改和控制-发生在子类初始化的"中间",如果有的话,等等。
基本上,出于完全相同的原因,初始化程序的超类委派在Python中不是自动的,对于任何其他方法,此类委派也不是自动的-请注意,那些"其他语言"对于任何其他方法都不会自动进行超类委派其他方法...只是针对构造函数(如果适用,则为析构函数),正如我所提到的,这不是Python的__init__。 (__new__的行为也很特殊,尽管实际上与您的问题没有直接关系,因为__new__是一个奇特的构造函数,实际上并不需要构造任何东西-可以很好地返回现有实例,甚至是非实例...显然,Python为您提供了比您所想到的"其他语言"更多的机制控制,这还包括在__new__本身中没有自动委派!-)。
受到鼓吹,因为对我来说,真正的好处是您提到的在子类初始化的任何时候(或根本没有)调用超类_init()_的能力。
-1表示" __init__不是构造函数...实际的构造函数...是__new__"。您自己注意到,__new__的行为与其他语言的构造函数不同。实际上,__init__非常相似(在创建新对象时调用该对象,在分配
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
