基本クラスのコンストラクタを呼び出す必要がなくなり、サブクラスのデフォルト値をオーバーライドできるようにすることで、サブクラスのコンストラクタを単純化することを目標にしている場合、Pythonがクラスの値を返すという共通のパラダイムがありますインスタンスに存在しない属性の場合もう少し具体的な例を使用して、代わりにやって
...
class Human(object):
def __init__(self):
self._fingers = 10
def __repr__(self):
return 'I am a %s with %d fingers' % (self.__class__.__name__, self._fingers)
class MutatedHuman(Human):
def __init__(self, fingers):
super(MutatedHuman, self).__init__()
self._fingers = fingers
print MutatedHuman(fingers=11)
print Human()
...あなたが使用することができます...
class Human(object):
_fingers = 10
def __repr__(self):
return 'I am a %s with %d fingers' % (self.__class__.__name__, self._fingers)
class MutatedHuman(Human):
def __init__(self, fingers):
self._fingers = fingers
print MutatedHuman(fingers=11)
print Human()
...どちらも出力の...
I am a MutatedHuman with 11 fingers
I am a Human with 10 fingers
重要な点は、実施例2における線self._fingers = fingers
は、デフォルト値を上書きしないことであるSE tをクラスHuman
に設定しますが、self._fingers
と参照すると非表示になります。
変数がリストなどの変更可能な型を参照すると、やや毛むくじゃらします。 self.name = value
を実行することはまだ安全ですが、デフォルト値で操作を実行しないように注意する必要があります。
このアプローチでは、通常、Good Thing(tm)である他のアプローチよりもコード行の数が少なくなる傾向があります。
出典
2016-06-19 15:01:42
Aya
サブクラス実装がすべてスーパークラス実装を呼び出す場合は、それらをそのまま残すことができます。 'class B(A):pass'はうまくいくでしょう。 * class *属性またはregular * instance *属性を探していますか?抽象的な例はあまりありませんか? – jonrsharpe
フィールド '_f 'が可変または不変型を参照する場合に依存します。 – Aya
'_f'はクラスフィールドかインスタンスフィールドであるはずですか? – schwobaseggl