2017-01-29 4 views
0

Каков правильный способ наследования атрибутов из экземпляров класса в Python 3?Наследование классов с использованием экземпляров класса вместо классов

Например, как наследовать атрибуты, такие как lastname из экземпляра Family класса:

class Family: 
    def __init__(self, last): 
     self.lastname = last 

class Person(Family): 
    def __init__(self, first): 
     self.firstname = first 

# The below code does not work an is an example of the desired usage: 
family = Family('Smith') 
person = Person('David', family) 

Цель для person наследовать атрибуты, такие как lastname из family экземпляра Family класса:

>>> person.firstname 
'David' 
>>> person.lastname 
'Smith' 
+0

Вы не наследуете эти атрибуты, вам нужно будет их инициализировать. –

ответ

0

Я вижу два варианта: реализовать def lastname(self) для класса человека и отложить выполнение хранимой семье.

В качестве альтернативы, вы можете осуществить __getattr__ на лицо и перенаправить все в семью. Я еще не уверен в этом подходе, хотя кажется, что он слишком похож на обычное наследование. Например. если у семьи был метод number_of_members(self), каждый человек тоже имел бы это. Если это нормально, регулярное наследование работает так же хорошо.

+0

еще одна мысль: вы могли бы использовать декоратор для каждого метода «Семья», который вы хотели бы скопировать на «Лицо». Затем в 'Person .__ init__' вы назначаете все методы с помощью правильного декоратора. Или просто проверьте декоратор в '__getattr__'. –

+0

Регулярное наследование работает в классах, но не в экземпляре класса, хотя не так ли? Я не возражаю, если методы семейства наследуются, это атрибуты экземпляров, которые необходимы. Другой ответ предлагает назначить атрибуты вручную. Однако есть десятки атрибутов, которые нужно унаследовать. Есть ли способ наследовать атрибуты из экземпляра класса, не назначая их явно? Или я делаю это неправильно и должны ли экземпляры 'People' быть добавлены в экземпляр класса« Семья »? – Greg

+1

@dave: Вы правы, так что вы хотите использовать вызовы методов прокси. Посмотрите на '__getattr__'. Вы можете написать что-нибудь из этого: 'def __getattr __ (self, name): return getattr (self.family, name)' –

0

Думаю, вам понадобится что-то вроде:

class Family: 
    def __init__(self, last): 
     self.lastname = last 

class Person(Family): 
    def __init__(self, first, family): 
     self.firstname = first 
     if isinstance(family, Family): 
      family = family.lastname 
     self.lastname = family 

family = Family('Smith') 
person = Person('David', family) 

или, может быть:

class Person(Family): 
    def __init__(self, first, family): 
     self.firstname = first 
     if isinstance(family, Family): 
      family = family.lastname 
     super().__init__(family) 
+0

Есть ли способ унаследовать от 'семейства' без указания' self.family = family.lastname'? Что, если у семьи есть 100 атрибутов, которые нужно унаследовать? Есть ли способ просто наследовать их, не назначая их явно? – Greg

+0

Не то, что я знаю без некоторых трюков. Давайте посмотрим, что кто-то еще придумает. Один из способов, если у вас много атрибутов, заключается в том, чтобы сохранить список атрибутов в виде списка и использовать '** kwargs' для инициализации классов. Но для этого все еще требуется явный код для инициализации одного экземпляра из другого. –

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

  • Нет связанных вопросов^_^