2016-06-30 6 views
0

클래스 상속에 대해 머리를 감싸려고했지만 자체 값을 부모 클래스에서 자식 클래스로 직관적으로 가져 오는 방법을 알아낼 수 없습니다. 부모 클래스에 키워드 변수를 추가해야 할 수도 있으므로 이상적으로 ** kwargs를 사용하고 싶습니다. 나는 최고를 인스턴스화 할 때임의의 수의 ** 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

'police_chief (new_officer)'- 아니, 아니요, 아니요. 수퍼 클래스 객체를 만든 다음 그 주위에 서브 클래스 객체를 작성하지 마십시오. – user2357112

+0

부모 클래스에서 상속하지만 원래 개체의 동일한 자체 값을 유지하는 새 개체를 만드는 방법을 잘 모르겠습니다. 어떤 방법이 있습니까? – Phil

+0

"원본 개체"를 전혀 만들지 않습니다. – user2357112

답변

3

, 당신은 완전히 police_chief에서 __init__을 남길 수 있습니다. 경찰청장이 __init__에서 할 추가 설정이 더 일반적인 경우

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

, 당신은 아마 super을 사용하십시오 :

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

슈퍼 1에 조금주의해야합니다. There are some pitfalls.. 그러나 well established idioms을 따르는 경우 괜찮습니다. 너는 police_officer.__init__(self, **kwargs)을 또한함으로써 우회 할 수 있었다.

1 정말 문제는, 그것의 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 사용하지 않도록 : 수석에 경찰관을 촉진, 당신은 대체 생성자가 필요 했어 nce는 전혀 (그리고 대신에 어떤 형태의 구성을 사용합니다).

+1

아니면 파이썬 3에서'super()'. 이봐, 사람들, 이미 $ CURRENTYEAR이야! 그것은 내 문제의 큰 부분처럼 보인다 – o11c

+0

내가 생각처럼 주위 클래스를 통과하지 못할 것입니다 I 수 : new_officer = police_officer (이름 = '대니') 최고 = police_chief (new_officer) 가 어떻게 복사 할 수 있습니다 자기 속성 경찰관을 장으로 승진시킬 때의 이름은? – Phil

+0

@Phil - 당신은 그것을 명백하게합니다. 최근 편집 내역보기 – mgilson