2012-05-22 3 views
3

저는 프로그래밍에 익숙하며 여전히 로프를 배우고 있습니다. 이 질문이 너무 초보적인 경우 사과드립니다.Python의 중첩 클래스에 대한 올바른 구문은 무엇입니까?

나는 내 질문을 명확히하는 것이 어렵다고 느껴서, 내가 원하는 것을 보여주고있다. a가 X 클래스의 인스턴스이고, a1, a2, a3, b1, b2의 속성을 가지고 있다고 가정하자. , b3, c1, c2 및 c3. a1을 a3으로, b1을 b3으로, c1을 c3을 통해 자신의 클래스 A, B, C에 X로 중첩하여 사용하기 쉽도록하려고합니다. 그렇게하는 올바른 구문은 무엇입니까? 이 이후

class X: 
    def __init__ (self, name, A, B, C): 
     self.name = name 
     self.A = A 
     self.B = B 
     self.C = C 
    class A (X): 
     def _init_ (self, name, a1, a2, a3): 
      self.name = name 
      self.a1 = a1 
      self.a2 = a2 
      self.a3 = a3 
    class B (x): 
     def _init_ (self, name, b1, b2, b3): 
      self.name = name 
      self.b1 = a1 
      self.b2 = a2 
      self.b3 = a3 
    class C (X): 
     def _init_ (self, name, c1, c2, c3): 
      self.name = name 
      self.c1 = a1 
      self.c2 = a2 
      self.c3 = a3 

이 전적으로 추측에 지어진, 나는 그것이 잘못 99.9 % 확신하지만, 나는 바로 그것을하기 위해 다음을 무엇을해야하는지 모르겠습니다. "중첩 된 클래스"답변을 검색해 보았지만 찾은 답변이 내 위치를 명확히 밝히지는 않았습니다.

파이썬에서 중첩 된 클래스에 대한 적절한 구문을 설명하십시오.

귀하의 도움에 감사 드리며이 기본 질문에 사과드립니다.

편집 : 지금 수정 한 코드에는 몇 가지 중요한 오타가있었습니다. 불편을 끼쳐 드려 죄송합니다.

+0

1. 기분 나쁘게 생각하지 마십시오. 우리에게 필요한 정보를 제공하려고한다면, 우리는 당신을 도우려고 노력할 것입니다. 2. "중첩 된 클래스"는 무엇을 의미합니까? 그러한 중첩으로 해결하려고하는 문제는 무엇이며, 그러한 중첩이 그 문제에 대한 올바른 해결책이라고 생각하는 이유는 무엇입니까? – inspectorG4dget

답변

1

당신은 상속을 찾고 있습니다.

또한 파이썬이 대소 문자를 구분하지 못한다는 것을 알았습니다. 이 aA이 같은 변수

class X: 
    def __init__ (self, name, a, b, c): 
     self.name = name 
     self.a = a 

class A (X): 
    def _init_ (self, name, a1, a2, a3): 
     self.name = name 
     self.a1 = a1 
     self.a2 = a2 
     self.a3 = a3 

class B (A): 
    def _init_ (self, name, a1, a2, a3): 
     self.name = name 
     self.b1 = a1 
     self.b2 = a2 
     self.b3 = a3 

class C (A): 
    def _init_ (self, name, a1, a2, a3): 
     self.name = name 
     self.c1 = a1 
     self.c2 = a2 
     self.c3 = a3 

희망하지 않는이 중첩 된 클래스는 그 정의가 다른 사람의 범위 내에서 존재 단순히 하나입니다

+0

불편을 끼쳐 드려 죄송합니다. 처음으로 코드에서 중요한 정보를 부주의하게 생략했습니다. 위의 코드는 내가 시도한 것이며 실패한 것입니다. 다시 한 번 잘못된 점을 지적하도록 도와 주시면 감사하겠습니다. –

+0

이 코드 중 어느 것도 작동하지 않습니다. * X의 하위 클래스 *는 X의 인스턴스 *에 속성을 추가 할 방법이 없습니다. 수퍼 콜이 없으므로 상속은 전혀 일어나지 않습니다. –

2

할 수 있다는 것을 의미한다. 일반적으로 파이썬에서 유용하지는 않습니다. 그러나, 당신이 원하는 것을 할 수 있고 한 클래스의 속성을 많은 클래스의 속성에서 끌어낼 수 있습니다. 두 가지 주요 방법은 믹스 인/다중 상속구성입니다.

믹스 인 접근 방식과 같이이다 : class X(A, B) : X으로

class A(object): 
    def __init__(self, a=None, *args, **kwargs): 
     self.a = a 
     super(A, self).__init__(*args, **kwargs) 

class B(object): 
    def __init__(self, b=None, *args, **kwargs): 
     self.b = b 
     super(B, self).__init__(*args, **kwargs) 

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

x = X(a='foo', b='bar') 
print x.a, x.b 
  • AB 모두의 속성을 가지고있다, 우리는 모두 상속했다.

  • __init__*args, **kwargs을 매개 변수로 허용합니다. 우리의 super() 전화는 X의 초기화 매개 변수를 AB의 초기화 프로그램에 전달하므로 다른 초기화 프로그램의 매개 변수를 받아 들일 수 있어야합니다. 즉, abA.__init__에 전달하지만 a 만 사용합니다.

  • super()에 대한 정보는 파이썬의 상속을 이해하는 데 필수적입니다.

그러나, 다중 상속은 과거의 간단한 예제를 관리하기가 어려울 수 있습니다, 그래서 종종 대신 구성 사용하는 것이 좋습니다 :

class A(object): 
    def __init__(self, a): 
     self.a = a 

class B(object): 
    def __init__(self, b): 
     self.b = b 

class X(object): 
    def __init__(self, a, b): 
     self.A = A(a) 
     self.B = B(b) 

x = X('foo', 'bar') 
print x.A.a, x.B.b 

당신이이 super() 통화에 대한 필요성을 제거 볼 수 있습니다 그리고 이니셜 라이저에 대한 특별한 매개 변수 처리를 위해 훨씬 더 명확하게 해줍니다. 여기서 우리는 두 개의 매개 변수를 취하고 내부적으로 관련 클래스를 구성하여 X 인스턴스에 연결합니다. 이 속성은 좀 더 어색 조회 수 있지만를 단순화하는 방법이 있습니다 : 그것은 수도

class X(object): 
    # <etc> 
    @property 
    def a(self): 
     return self.A.a 

__getattr__을 무시하고 각 속성을 손으로 코딩하는 대신 일부 동적 조회를 할 수는.

class X(object): 
    # <etc> 
    def __getattr__(self, item): 
     for component in (getattr(self, c) for c in ['A', 'B']): 
      if hasattr(component, item): 
       return getattr(component, item) 

또 다른 옵션은 자신의 구성 인스턴스를 전달하는 것입니다 : XA과 인터페이스가 아닌 다른 B에 대해 아무것도 아는

class X(object): 
    def __init__(self, A, B): 
     self.A = A 
     self.B = B 

x = X(A('foo'), B('bar')) 
print x.A.a, x.B.b 

이 어떤 필요가 없습니다. 이렇게하면 캡슐화가 쉬워집니다. AB을 적절한 모듈에 붙여 넣을 수 있습니다. 편의를 위해 팩토리 함수를 사용할 수도 있습니다.

def make_X(a, b): 
    return X(
     A(a), 
     B(b) 
    ) 
관련 문제