2017-08-16 5 views
0

が、私はこのようなクラスを書くことを探しています:私はこのようなFirstClassクラスを設定しようとしたPythonは:子クラスからの変更親クラスのプロパティは、Python(v3.6.1)では

class SecondClass(FirstClass): 
    property = "custom" 

print(SecondClass.name) #=> "john" 

class SecondClass(FirstClass): 
    property = "notcustom" 

print(SecondClass.name) #=> "steve" 

class FirstClass: 
    if property == "custom": 
     name = "john" 
    else: 
     name = "steve" 

しかし、私はFirstClassのプロパティをSecondClassから編集できないようです。

これは可能ですか?

+0

あなたは何Pythonのバージョンを使用していますか? –

+0

質問にバージョンを追加しました。(それは3.6.1です) –

+0

'init'と' self'セクションがありません。構文のためにPythonモジュールを開いてください。 – dsgdfg

答えて

3

また、propertyを使用していないものから新しい__init_subclass__メソッドを使用して尋ねます。 __init_subclass__のドキュメント:。。。

含むクラスをサブクラス化されるたびに、このメソッドが呼び出されCLSは、新しいサブクラスで、通常のインスタンスメソッドとして定義されている場合、このメソッドは暗黙的にクラスメソッドに変換され、

class FirstClass: 
    def __init_subclass__(cls): 
     super().__init_subclass__() 
     if cls.property == "custom": 
      cls.name = "john" 
     else: 
      cls.name = "steve" 

class SecondClass(FirstClass): 
    property = "custom" 

print(SecondClass.name) 

class SecondClass(FirstClass): 
    property = "notcustom" 

print(SecondClass.name) 

のPython 3.5と下位で動作する方法については、あなたは、いくつかのメタクラスの魔法を使用することができます。

class FirstClass(type): 
    def __init__(cls, name, bases, attrs): 
     if cls.property == "custom": 
      cls.name = "john" 
     else: 
      cls.name = "steve" 
     super(FirstClass, cls).__init__(name, bases, attrs) 

class SecondClass(metaclass=FirstClass): 
    property = "custom" 

print(SecondClass.name) 

class SecondClass(metaclass=FirstClass): 
    property = "notcustom" 

print(SecondClass.name) 
1

@classmethodこちらのほうがよいでしょう。

class First: 
    @classmethod 
    def name(cls): 
     return "john" if cls.prop() == "custom" else "steve" 

class Second(First): 
    @classmethod 
    def prop(cls): 
     return "custom" 

print(Second.name()) # -> john 

class Second(First): 
    @classmethod 
    def prop(cls): 
     return "notcustom" 

print(Second.name()) # -> steve 

(つまり、すでに言語のキーワードだから、あなたは、Python 3.6を使用しているので、あなたが達成することができます

+0

ポインタのための+1と 'property'の注釈はPythonのキーワードですが、@Christian Deanの答えはまさに私の後のものでした –

関連する問題