2013-02-25 97 views
1

我在這裏有一些單元轉換程序的代碼;它會拋出一個NameError,因爲Python的繼承順序。Python的類變量和繼承

class _Units : 
    _metric_unit_names = {'metric'} 
    _standard_unit_names = {'standard'} 

class TemperatureUnits (_Units) : 
    _metric_unit_names.update({'celsius', 'c'}) 
    _standard_unit_names.update({'fahrenheit', 'f'}) 

TemperatureUnits() 

我想知道這種情況下最好的技術是什麼。我可以製作_metric_unit_names_standard_unit_names實例變量,但是在每個實例上創建一個新集合似乎很浪費。在這種特殊情況下,共享行爲似乎也是最佳的。

+1

什麼讓你相信你需要多個類,甚至在這裏繼承,當同一類的多個實例可能是足夠的?在這裏沒有顯示的子類中是否存在一些行爲? – 2013-02-26 00:04:22

回答

3

最好的方法是不要將屬性定義爲類的靜態屬性。什麼你以後是這樣的:

class _Units : 
    def __init__(self): 
     self._metric_unit_names = {'metric'} 
     self._standard_unit_names = {'standard'} 

class TemperatureUnits (_Units) : 
    def __init__(self): 
     _Units.__init__(self) 
     self._metric_unit_names.update({'celsius', 'c'}) 
     self._standard_unit_names.update({'fahrenheit', 'f'}) 

TemperatureUnits() 

定義屬性的__init__以外的原因它們是類(即_Units._metric_unit_names)的靜態成員。在init中定義它們使它們成爲類實例的屬性(即my_units_instance._metric_unit_names)。

+2

你錯過了一些'self's – 2013-02-25 23:41:31

+1

Woops,謝謝你指出我的疏忽:P – 2013-02-25 23:43:22