2017-01-29 1 views
0

Python 3의 클래스 인스턴스에서 속성을 상속하는 올바른 방법은 무엇입니까?클래스 대신 클래스 인스턴스를 사용하는 클래스 상속

Family 클래스의 인스턴스에서 같은 lastname 같은 속성을 상속하는 방법을 예를 들어

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) 

personFamily 클래스의 family 인스턴스에서 lastname과 같은 속성을 상속하는 목적은 다음과 같습니다

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

이러한 특성은 상속받지 않으므로 초기화해야합니다. –

답변

0

나는 두 가지 옵션을 참조하십시오 사람 클래스 def lastname(self)을 구현하고 저장 가족 구현을 연기.

또는 다른 사람에게 __getattr__을 구현하고 모든 것을 가족에게 전달할 수 있습니다. 나는이 접근법에 대해서는 아직 확실하지 않다. 정규 상속과 너무 비슷하게 보인다. 예 : 가족이 방법 number_of_members(self)을 가진 경우에, 각 사람은 또한 그것을 가지고있을 것입니다. 그래도 괜찮 으면 정규 상속이 제대로 작동합니다.

+0

다른 생각 :'Family'의 각 메소드에'Person'에 복사하고 싶은 데코레이터를 사용할 수 있습니다. 그런 다음'Person .__ init__'에서 모든 메소드에 올바른 데코레이터를 할당합니다. 또는'__getattr__'에서 데코레이터를 확인하십시오. –

+0

정규 상속은 Classes에서는 작동하지만 Class 인스턴스에서는 작동하지 않습니까? 가족의 방법이 계승 된 것이라면 나는 상관하지 않는다. 그것은 필요한 인스턴스의 속성이다. 또 다른 대답은 수동으로 속성을 할당하는 것이 좋습니다. 상속 받아야 할 수십 가지의 속성이 있습니다. 명시 적으로 할당하지 않고 클래스 인스턴스의 속성을 상속하는 방법이 있습니까? 내가 잘못하고 있으며 'People' 인스턴스를'Family' 클래스 인스턴스에 추가해야합니까? – 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'을 지정하지 않고'family'에서 상속하는 방법이 있습니까? 가족에게 계승해야 할 100 가지 속성이 있다면 어떻게 될까요? 명시 적으로 할당하지 않고 상속하는 방법이 있습니까? – Greg

+0

내가 속임수없이 알고 있다는 것은 아니다. 다른 사람이 무엇을 생각해 내는지 보자. 한 가지 방법은 속성이 많은 경우 속성 목록을 목록으로 유지하고 클래스를 초기화하는 데'** kwargs '를 사용하는 것입니다. 그러나 이것은 여전히 ​​하나의 인스턴스를 다른 것으로 초기화하는 데 명시적인 코드가 필요합니다. –