2016-10-22 7 views
2

私はDo not Repeat Yourself(DRY)原則に非常に似ています。その一例として、私はその定義の中でクラスの名前を使用するのは好きではありません。 (クラス名を変更したい場合は、クラス定義内のすべてのものを変更しなければならない場合もあります。)Python 2.7のスーパークラス属性へのアクセスはDRYではありませんか?

docsで読み取ったスーパークラス属性にアクセスする典型的な慣用句「タイプ(自己)」または「自己.__ class__」B.

をサブクラス化するとき、代わりに無限再帰につながるの使い方

class A(object): 
    def method(self): 
     print('Hi!') 
class B(A): 
    def method(self): 
     super(B, self).method() # fixed reference to B, not DRY 

のようにクラス名は、私はこのケースではDRYをスキップする必要がありますか?あるいは、サブクラスの定義の中でそのサブクラスを参照する他の魔法の属性がありますか?

答えて

1

example in the documentationは、子クラスの明示的な名前を使用します。私が知る限り、これは単なるPython 2.7の不幸な、避けられない欠点です。

しかし、これは私のために働くようだ:

class A(object): 
    def method(self): 
     print('Class A method') 
class B(A): 
    def __init__(self): 
     self.myclass = B 
     super(self.myclass, self).__init__() 
    def method(self): 
     print('Class B method') 
     super(self.myclass, self).method() 

これはB内部の明示的なクラス名の1つの発生を残し、私はself.myclassを使用して、任意の他の人を避けることができます。

+0

ドキュメント参照のおかげで、Tom。しかし、これは "B"のクラス定義の中の "B"の数を減らすかもしれませんが、まだDRYではありません。今まで他の答えが出ていないので、あなたが書いているように、それはやむを得ないものと考えています。 – virtualnobi

0

これは古い質問ですが、ここでは参考にしておきたいと思います。

metaclassesのクラスを含む属性を自動的に追加することは可能です。このような

何かが動作します:

class Metaclass(type): 
    def __init__(cls, name, bases, attrs): 
    cls.what_class = cls 

class A(metaclass=Metaclass): 
    pass 

class B(A): 
    pass 

print(A().what_class) # <class 'A'> 
print(B().what_class) # <class 'B'> 

あなたが別のメタクラスでこれを使用したい場合は、私はthis questionになります。

関連する問題