2011-12-18 3 views
2

Python 버전 2.7.상위 클래스 멤버의 완전히 새로운 인스턴스를 만들 수 있습니까?

시나리오 내가없이 class B의 인스턴스 x 자신의 복사본을 한을 가지고 __init__에있는 모든 클래스 멤버 정의를하는 것보다 다른 방법이 있는지 알고 싶습니다 무엇

class A(object): 
    x = 0 

class B(A): 
    pass 

ai = A() 
bi = B() 

#Then: 
id(ai.x) == id(bi.x) 
>>> True 

class B에서 다시 정의해야합니까? 아마도 type()의 트릭이 있습니까?

아직 찾지 못했지만 계속 살펴볼 것입니다. 여기서 답을 찾을 수있는 최적의 장소라고 생각했습니다. 어떤 통찰력이라도 대단히 감사합니다.

편집 : 정말 최고의 예제를 사용하지 않은으로 문법

EDIT2는 명확합니다.

class Y(object): 
    def __init__(self): 
     self.z = 0 

class A(object): 
    x = Y() 

class B(A): 
    pass 

ai = A() 
bi = B() 

id(ai.x) == id(bi.x) 
>>> True 
ai.x.z = 3 
id(ai.x) == id(bi.x) 
>>> True 

이제 문제는 내가 class Bx를 다시 할당하지 않는 것이 발생 그들은 class Y의 동일한 인스턴스에 모두 포인트 경우에도 class Y 변화의 인스턴스의 멤버.

장고에 익숙하다면 양식이 어떻게 작동하는지 재현하고 있습니다. 나는 폼에 대해 metaclass과 함께 가고 새로운 인스턴스가 생성 될 때마다 필드의 사전을 구축하기로 결정하지 않았다. 어쩌면 metaclass을 사용하여 전환해야 할 것이다.

세 번째를 편집하십시오. 저는 통역관에게 지금 요청하고있는 불가능 성을 깨닫고 있습니다. 클래스의 인스턴스를 멤버에게 할당하면 상속 된 클래스가 해당 클래스의 새 인스턴스를 만드는 방법을 알 수 없습니다. 따라서 내 문제는 메타 솔루션이 유일한 해결책 인 것 같습니다.

답변

2

예를 들어, 변경 불가능한 개체는 중요하지 않습니다. bi은 새 객체가 할당 된 경우이를 참조합니다.

class A(object): 
    x = 0 

class B(A): 
    pass 

ai = A() 
bi = B() 

print id(ai.x) == id(bi.x) 
ai.x=3 
print id(ai.x) == id(bi.x) 

결과 : 당신이 __init__x를 초기화하더라도, 그 인해 구현 정의 행동, 불변의 객체가 여전히 캐시 및 재사용 및 인스턴스 aibi 될 수 있음을 또한

True 
False 

주, 0 개체를 공유하십시오. (CPython의 2.7.2)와

class A(object): 
    def __init__(self): 
     self.x = 0 

class B(A): 
    pass 

ai = A() 
bi = B() 

print id(ai.x) == id(bi.x) 
ai.x=3 
print id(ai.x) == id(bi.x) 

결과 :

True 
False 
관련 문제