2017-12-03 1 views
3

파생 된 클래스를 파이썬에서 기본 클래스로 잘라내는 방법을 알려주는 문서가 없다는 것에 놀랐습니다. 파이썬에서 파생 클래스를 기본 클래스로 잘라낼 수 있습니까?

실제로 사용량이 적을 수 있습니다.

간체 :하지만 AA 문제에 직면하고있어

기본 클래스

class Base(object): 
    def __init__(self): 
     self.a = 10 

및 파생 클래스 :

class Derived(Base): 
    def __init__(self): 
     super(Derived, self).__init__() 
     self.b = 10 

지금 어떤 상황에서, 내가 병합해야 Derived 및 Base 일 수있는 데이터 및 데이터 필드를 기본에만 유지하므로 은 파생 된 부분을 잘라내야합니다. Base까지,하지만 나는 아무것도 발견하지 못했습니다.

get_base 메서드를 Base와 Derived 모두에서 만들려고했는데 super(Derived, self).get_base()에 의해 Base에서 반환하도록했지만 반환 된 결과는 여전히 파생되었습니다!

내가 ... 기본의 __dict__ 그리고 그것은 단지 방법, 아니 사용자 정의 속성을 가지고 있음을 발견 궁금 해요

를 파생 인스턴스에서 자료의 데이터 필드를 얻을 수있는 방법이 존재되어 인쇄 (절단)? 내가 궁금하네요

답변

4

는 파생 예 (잘라 내기)에서 자료의 데이터 필드를 얻을 수있는 방법이 존재인가?

인스턴스 데이터는 기본 클래스 또는 파생 클래스로 작성 (변경)되었는지 여부를 구분하지 않습니다. 원본과 관계없이 특성은 동일한 인스턴스 사전에 저장됩니다. 말했다

>>> c = Derived() 
>>> vars(c) 
{'a': 10, 'b': 10} 

, 당신은 그들이 사용하는 변수 이름-찾기 위해 __init의 __() 메서드 성찰 수 : 시작점이 인스턴스의 혼합 목록입니다

>>> Base.__dict__['__init__'].__code__.co_names 
('a',) 
>>> Derived.__dict__['__init__'].__code__.co_names 
('super', 'Derived', '__init__', 'b') 

경우를, 당신은을 식별 할 수 각 인스턴스의 내용을 교차시켜 일반 속성을 사용하여 잘린 데이터 만 조회 할 수 있습니다.

instances = [Base(), Derived(), Base(), Derived(), Base()] 
common_attributes = reduce(set.intersection, map(set, map(vars, instances))) 
for inst in instances: 
    print {attr: getattr(inst, attr) for attr in common_attributes} 
+0

오, 너무 똑똑! 매우 감사합니다! 파이썬은 생각보다 유연하고 복잡합니다. –

관련 문제