2017-12-11 10 views
0

私は同じ方法で、しかし異なるクラスで使いたい属性の2つのセットを持っています。Python 3の異なるクラスで同じクラス属性を使用する方法は?

class Base: 
    def printAttr(): 
     print(attr) 

class MixIn1: 
    attr = "Monty" 

class MixIn2: 
    attr = "Python" 

class Combo1(Base, MixIn1): 
    pass 

class Combo2(Base, MixIn2): 
    pass 

c1 = Combo1() 
print(c1.attr) # it is assigned 
c1.printAttr() 

結果はNameError: name 'attr' is not definedです:私はクラスがsuper呼び出し、不要な合併症を避けるために、属性としてこれらのセットにミックスしようとしています。明らかに、MixIn1.attrを明示的に呼び出すと動作しますが、このコードをクラス自体に入れることは同じです。

経済的に異なるattrに同じ処理ロジックを使用するにはどうすればよいですか?

+0

エラーは表示されているコードと一致しません。 –

+3

実際のコードを表示してください。 'printAttr'に' self'パラメータがないので、あなたが投稿したコードはTypeErrorをスローします。 'attr'がそのメソッドで定義されていないので、NameErrorを投げます。 –

+0

また、 'printAttr'メソッドに' self'パラメータがありません。 –

答えて

1

は、法によって要求される(通常はselfと呼ばれる)1つの位置引数を追加し、適切にそれを使用し、それはあなたが期待するように動作します:

class Base: 
    def printAttr(self): 
     print(self.attr) 

>>> c1 = Combo1() 
>>> c1.printAttr() 
Monty 

>>> c2 = Combo2() 
>>> c2.printAttr() 
Python 
+0

ありがとうございます。私は、 'self'はクラス属性ではなくインスタンス属性に対してのみ必要と考えました。 – homocomputeris

0

クイックヒント:あなたが機能(メソッド)を使用しているときはいつでもクラスの下では、常にそのパラメータに「自己」を与えます。これはすべての方法にとって必須です。事実、Pycharm IDEを使用すると、selfパラメータが自動的に完成します。

関連する問題