2017-08-16 32 views
0

在蟒蛇(v3.6.1),我期待像這樣寫一個類:的Python:從子類改變父類的屬性

class SecondClass(FirstClass): 
    property = "custom" 

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

class SecondClass(FirstClass): 
    property = "notcustom" 

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

我試圖建立FirstClass類是這樣的:

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

但我似乎無法編輯從SecondClass FirstClass屬性。

這可能嗎?

+0

什麼Python版本您使用的? –

+0

我已經將該版本添加到問題中了(它是3.6.1) –

+0

'init'和'self'部分缺失,請打開任何python模塊進行語法分析,將指導您。 – dsgdfg

回答

3

由於您使用Python 3.6,你可以完成你的要價使用新__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 

(也不要使用property,因爲這是已經在語言中的關鍵字

+0

指針的+1和'property'是Python中的關鍵字,但@Christian Dean的回答正是我之後的回答 –