新しいメソッドを明示的に呼び出さなくても、ドータークラスに追加の属性を与えたいと思います。それで、継承されたクラスに、親クラスの__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
ありがとうございました
私が知る限りそれは不可能ですが、次のようにスーパークラスのinitメソッドを呼び出すことができます。
class inheritedclass(initialclass):
def __init__(self):
initialclass.__init__(self)
self.attr3 = 'three'
親の__init__
super
を使用:
class inheritedclass(initialclass):
def __new__(self):
self.attr3 = 'three'
super(initialclass, self).__init__()
Pythonの命名規則に従い、大文字でクラスを開始することを強くお勧めします。 InheritedClass
およびInitialClass
。これにより、クラスをメソッドや変数からすばやく区別できます。
まず最初にあなたが混ぜているのは__init__
および__new__
、それらは 異なるもの です。 __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__()
信じられないほど簡単です。新しい__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
に。
class initialclass:
def __init__(self):
self.attr1 = 'one'
self.attr2 = 'two'
class inheritedclass(initialclass):
def __init__(self):
super().__init__()
self.attr3 = 'three'
def somemethod(self):
print (self.attr1, self.attr2, self.attr3)
a=inheritedclass()
a.somemethod()
1. List item
存在する場合は、親のinitから指定されたメソッドを呼び出すだけです。
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'