2016-06-30 8 views
0

Я пытаюсь обернуть голову над наследованием класса, но я не могу понять, как получить значения self от родительского класса до класса Child интуитивным способом. В идеале я бы хотел использовать ** kwargs, потому что мне может понадобиться добавить дополнительные ключевые слова в класс Parent.Наследование классов с произвольным числом ** kwargs?

class police_officer(object): 
    def __init__(self, name=None, age='40'): 
     self.name = name 
     self.age = age 

class police_chief(police_officer): 
    def __init__(self): 
     pass # What should put I here to inherit the __init__() values? 


new_officer = police_officer(name='Danny') 
chief = police_chief(new_officer) 

print(chief.name) 

Это мой единственный вариант явно вызвать каждую переменную, когда я экземпляр главный? (Пример):

chief = police_chief(name=new_officer.name, age=new_officer.age) 
+1

'polic_chief (new_officer)' - нет, нет, нет. Вы не создаете объект суперкласса, а затем создаете вокруг него объект подкласса. – user2357112

+0

Я не уверен, как создать новый объект, который наследуется от родительского класса, но сохраняет те же самые собственные значения исходного объекта. Там в любом случае? – Phil

+0

Вы не создаете «оригинальный объект» вообще. – user2357112

ответ

3

В этом случае, вы можете оставить от __init__ в police_chief полностью.

class police_chief(police_officer): 
    """A police officer who is chief.""" 

В более общем случае, когда начальник полиции имеет дополнительные настройки, чтобы сделать в __init__, вы, вероятно, использовать super:

class police_chief(police_officer): 
    def __init__(self, is_boss=True, **kwargs): 
     super(police_chief, self).__init__(**kwargs) 
     self.is_boss = is_boss 

Будьте немного осторожны с супер . There are some pitfalls.. Однако, если вы последуете за well established idioms, вы будете в порядке. Вы можете обойти его, сделав также police_officer.__init__(self, **kwargs).

Действительно проблема не с super (за се), это больше проблема множественного наследования. Для одиночного наследования нет ошибок с супер и нет реальных различий между его использованием и вызовом метода суперкласса напрямую.


Как вы уже упоминали, так что вы бы тогда создать экземпляр начальника полиции, передавая police_officer аргументы начальника полиции конструктора:

chief = police_chief(name=new_officer.name, age=new_officer.age) 

Если вы хотите, чтобы иметь возможность содействие сотруднику полиции к начальнику, вы должны были бы иметь альтернативный конструктор:

class police_chief(police_officer): 
    @classmethod 
    def promote(cls, officer, **kwargs): # create_from_officer is probably a better name ... 
     return cls(
      name=officer.name, 
      age=officer.age, 
      **kwargs) 

Или, возможно, реструктурировать к коду, чтобы не использовать inherita (и вместо этого использовать какую-то форму композиции).

+1

Или просто 'super()' в Python3. Приходите, люди, это уже $ CURRENTYEAR! – o11c

+0

Похоже, большая часть моей проблемы заключается в том, что я не могу передать классы вокруг, как я думал, что я мог бы: new_officer = police_officer (имя = «Danny») главный = police_chief (new_officer) Как я могу скопировать атрибут самостоятельно как имя при продвижении офицера к начальнику? – Phil

+0

@Phil - Вы делаете это явно. См. Мои последние изменения. – mgilson