2010-01-03 4 views
3

는 지금은 매개 변수 객체의 클래스처럼 상속을 사용하므로어떻게 파이썬에서 '매개 변수 객체'리팩터를 구현합니까?

class A(): 
    def __init__(self,p1,p2): 
     self.p1, self.p2 = p1, p2 

class B(A): 
    def __init__(self,b): 
     self.p1, self.p2 = b.p1, b.p2 

이 코드가 아니라 클래스 코드 자체를 사용하는 부조리를 트림. 그래서, C++ 일을하고 초기화 목록에 매개 변수 개체를 전달할 싶습니다

class A { 
    int p1,p2; 
} 
class B : public A { 
    B(const A& a) : A(a) {} 
} 

파이썬에서이 작업을 수행 할 수 있습니까? 특히 부모 클래스의 속성을 자식 클래스의 __init__이라고 부르는 방식으로 설정할 수 있습니까? - "Dive into Python"을 읽는 것에서부터 객체가 이미 구성된 시간 인 __init__이 호출되기 때문에이 작업을 수행 할 수 있다고 생각합니다.

또는 아마도 parameter object refactor을 Python으로 구현하는 다른 방법이있을 것입니다. (저는 C++ 기술을 강제 적용하려고합니다)?

답변

3

일반적으로 매개 변수 개체 리팩터 기술은 필요하지 않습니다. 파이썬에는 표준 라이브러리에 이미 매개 변수 객체 리팩터가 제공 할 수있는 몇 가지 중요한 이점이있는 여러 컬렉션이 있습니다.

또한 매개 변수 개체 디자인 패턴과 같은 리펙터의 비용 ​​/ 이점 분석은 C++와는 분명히 다릅니다. 예를 들어 정적 컴파일이 없으면 객체 생성 및 멤버 조회가 훨씬 더 비쌉니다. 매개 변수 객체 패턴의 기본 경우는 관련 필드에 대한 네임 스페이스를 제공하는 것으로 파이썬에서 사전으로 충분히 간단하게 수행 할 수 있습니다.

그룹화 된 데이터와 관련된 메소드의 형태로 어떤 종류의 모델 조작이 필요한 경우 패턴이 파이썬에서 더 많은 가치를 가지지 만 "특성"만큼 간단하고 저렴한 메커니즘이 멤버의 조작 요구를 해결할 수 있습니다 속성.

문제 공간에 대해 좀 더 자세하게 설명하면이 종류의 리팩터가 이점인지 여부를 평가할 수 있지만 Python에서 작업 할 때 해당 디자인 패턴을 사용하지 않는 것이 좋습니다. 파이썬에

+0

예, 매개 변수 개체를 사용하기로 결정한 개념적 문제는 생략했습니다. 지금 당장이 코드를 C++에서 Python으로 번역하고 있습니다. 나중에이 점에 대해 더 깊이 생각해야 할 것입니다. – bias

1
class B(A): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 

자세한 내용은 super()을 참조하십시오.

+2

그냥 완전히 불구하고 그것을 밖으로 떠날 수 init__' 즉 당신이'B .__에서 할 거라고 모두 있다면. 부모 '__init__'는 당신을 위해 일을 할 것입니다. –

+1

흠 .... 두 번째 읽기에서, 이것은 정확하지 않습니다! OP가 원하는 것처럼 다른 인스턴스의 속성을 전송하지 않습니다. –

+0

원본 게시물에 대한 중요한 점은 하위 클래스에 전달 된 단일 인수를 기본 클래스에서 유용한 정보로 압축 해제 할 수 있으며 super() 접근 방식 (따라서이 대답)이 확실히이 솔루션 중 하나라는 것입니다. – Kylotan

2

는 C++ 코드의 번역은 것 같은 뭔가 :

class A(): 
    def __init__(self,p1,p2): 
     self.p1, self.p2 = p1, p2 

class B(A): 
    def __init__(self,b): 
     A.__init__(self, b.p1, b.p2) 
관련 문제