我想给一个子类一些额外的属性,而不必显式调用一个新方法。那么有没有一种方法可以为继承的类提供__init__
类型的方法,该方法不会覆盖父类的__init__
方法?
我编写下面的代码纯粹是为了说明我的问题(因此属性命名不佳等)。
class initialclass():
def __init__(self):
self.attr1 = 'one'
self.attr2 = 'two'
class inheritedclass(initialclass):
def __new__(self):
self.attr3 = 'three'
def somemethod(self):
print 'the method'
a = inheritedclass()
for each in a.__dict__:
print each
#I would like the output to be:
attr1
attr2
attr3
谢谢
答案 0 :(得分:33)
据我所知,这是不可能的,但你可以调用超类的init方法,如下所示:
class inheritedclass(initialclass):
def __init__(self):
initialclass.__init__(self)
self.attr3 = 'three'
答案 1 :(得分:16)
只需使用__init__
:
super
class inheritedclass(initialclass):
def __new__(self):
self.attr3 = 'three'
super(initialclass, self).__init__()
我强烈建议遵循Python的命名约定,并使用大写字母开始一个类,例如InheritedClass
和InitialClass
。这有助于快速区分类与方法和变量。
答案 2 :(得分:5)
首先,您要混合__init__
和__new__
,它们是different things。 __new__
不将实例(self
)作为参数,它需要类(cls
)。
至于问题的主要部分,您需要做的是使用super
来调用超类“__init__
。
您的代码应如下所示:
class initialclass(object):
def __init__(self):
self.attr1 = 'one'
self.attr2 = 'two'
class inheritedclass(initialclass):
def __init__(self):
self.attr3 = 'three'
super(inheritedclass, self).__init__()
答案 3 :(得分:3)
这非常简单。定义新的__init__
方法,并在开头调用父级__init__
。
# assuming a class Base, its __init__ takes one parameter x
class Derived(Base):
def __init__(self, x, y):
# whatever initialization is needed so we can say Derived is-a Base
super(Derived, self).__init__(x)
# now, add whatever makes Derived special - do your own initialization
self.y = y
在Python 3中,您不必(为了简单起见,因此不应该)明确地继承object
或将类self
传递给super
。< / p>
答案 4 :(得分:0)
只需从父进程调用指定的方法(如果存在):
class initialclass():
def __init__(self):
self.attr1 = 'one'
self.attr2 = 'two'
if hasattr(self, 'init_subclass'):
self.init_subclass()
class inheritedclass(initialclass):
def init_subclass(self):
self.attr3 = 'three'
答案 5 :(得分:0)
'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],