2012-11-21 2 views
1

가정하자 나는 다음을 수행하기 위해 내가 할 수 싶습니다 두 파이썬 클래스 A와 B가 있습니다 '는이'의 인스턴스동적 라 __setattr__ 파이썬 인스턴스 클래스 인스턴스를 추가

>>> b = B() 
>>> b.a.attr1 = 'foo' 
>>> b.a.attr2 = 'bar' 

을 A. 'a'가 일부 '원시'유형 인 경우 __setattr__을 사용할 수 없습니다. 이를 달성 할 수있는 우아한 방법이 있습니까?

>>> b = B() 
>>> b.a = A() 
>>> b.a.attr1 = 'foo' 
>>> b.a.attr2 = 'bar' 

? __getattr__ hook 동적 a을 만드는 데 사용하는, B__init__a을 만들거나 property을 사용 중 하나에

+6

'self.a = A()'를'B .__ init__' 메소드에 넣지 않는 이유는 무엇입니까? – Maxim

+0

나는 언급 했어야했다 ... 내가 무조건적으로'__init__ '(잠재적으로) 인스턴스화하는 많은 클래스가 사용되지 않기 때문에 나는 그것을 할 수 없다. 또한, A()의 일부 코드는'__init__' 시간에 반드시 준비가되지 않을 수도 있습니다. 감사. –

답변

2

당신은이 것입니다.

__init__ 방법 :

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

__getattr__ 방법 :

class B(object): 
    def __getattr__(self, attr): 
     if attr == 'a': 
      self.a = A() 
      return self.a 
     raise AttributeError(attr) 

재산권 방법 : 물론

class B(object): 
    _a = None 

    @property 
    def a(self): 
     if self._a is None: 
      self._a = A() 
     return self._a 

, 호텔과 __getattr__ 접근이 안 t이 o A() 인스턴스를 self에 저장하면 다른 인스턴스에서 이미 존재하는 A() 인스턴스를 반환 할 수 있습니다.

+0

HA !! 당신의'__getattr__' 접근 방식은 제가 찾고있는 것과 정확히 같습니다. 'baattr1 ='foo '로 속성을 설정 했으므로'__GETattr__'을 사용하지 않을 것입니다.'__init__'은 나를위한 선택 사항이 아닙니다. 클래스의 묶음을 인스턴스화하고 싶지 않기 때문입니다. 나는 잠재적으로 사용하지 않을 것이다. 나는 그것을 언급 했어야했다. 감사. –

0
class A(object): 
    pass 

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

b = B() 
b.a.attr1 = 'foo' 
b.a.attr2 = 'bar' 
관련 문제