web-dev-qa-db-ja.com

python継承されたクラスの__init__メソッド

新しいメソッドを明示的に呼び出さなくても、ドータークラスに追加の属性を与えたいと思います。それで、継承されたクラスに、親クラスの__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

ありがとうございました

20
Anake

私が知る限りそれは不可能ですが、次のようにスーパークラスのinitメソッドを呼び出すことができます。

class inheritedclass(initialclass):
    def __init__(self):
        initialclass.__init__(self)
        self.attr3 = 'three'
33
Yexo

親の__init__superを使用:

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'
        super(initialclass, self).__init__()

Pythonの命名規則に従い、大文字でクラスを開始することを強くお勧めします。 InheritedClassおよびInitialClass。これにより、クラスをメソッドや変数からすばやく区別できます。

16
Adam Matan

まず最初にあなたが混ぜているのは__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__()
5
vartec

信じられないほど簡単です。新しい__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に。

3
user395760
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
0
Sacchit Jaiswal

存在する場合は、親の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'
0