2013-02-25 3 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

Что заставляет вас думать, что вам нужно несколько классов и даже наследование здесь, когда, вероятно, будет достаточно нескольких экземпляров одного и того же класса? Есть ли какое-то поведение в подклассах, которые вы здесь не показывали? –

ответ

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

Вам не хватает некоторых 'себя' –

+1

Woops, спасибо, что указал на мой надзор: P –

Смежные вопросы