2013-06-07 3 views
3

아래는 자바 코드입니다. 나는 파이썬에 해당하는 코드를 알고 있어야합니다 클래스가 아직 class: 블록이 끝날 때까지 정의되지 않았기 때문에 당신은 파이썬 클래스 정의 내에서이 작업을 수행 할 수파이썬에서 같은 클래스의 객체를 참조하는 클래스 변수를 정의하는 법

class A { 
    public static A obj = new A(); 
} 
+0

관련 항목 : http://stackoverflow.com/questions/16935346/can-a-class-variable-be-an-instance-of-the-class –

+0

@PravatPanda - OP가 해당 자바 파이썬으로 구성하십시오. 아마도이 질문을 이해할 수있는 사람들도 자바를 가장 잘 압니다. – mgilson

+0

@mgilson 미안하지만 처음에는 그 질문을 이해하지 못했습니다. –

답변

6

.

class A(object): 
    pass  
A.obj = A() 
+9

일반적으로 파이썬에서는 그렇게하지 않는다는 것에주의하십시오. Java에서이 작업을 수행하는 이유는 파일이 아닌 클래스를 가져 오는 것이므로 클래스의 "기본"인스턴스를 해당 클래스 자체의 정적 멤버로 유지하는 것이 좋습니다. 파이썬에서는 모듈을 가져오고 인스턴스는 클래스 외부에 존재할 수 있으므로 클래스의 기본 인스턴스를 클래스가 정의 된 모듈의 모듈 수준 변수로 만드는 것이 좋습니다. –

4

당신은 메타 클래스와 함께이 작업을 수행 할 수 있습니다 : 후에 당신은 그것을 설정해야합니다

class SelfReferencingObjectMetaclass(type): 

    def __new__(cls, name, bases, attrs): 

     attrs['obj'] = property(lambda self: self.__class__.obj) 
     return super(SelfReferencingObjectMetaclass, cls).__new__(cls, name, bases, attrs) 

    @property 
    def obj(cls): 

     try: 
      return cls._obj 
     except AttributeError: 
      cls._obj = cls() 
      return cls._obj 

class A(object): 

    __metaclass__ = SelfReferencingObjectMetaclass 

@Daniel Roseman이 코멘트에 노트로 @ jamylak의 대답은하지만, 아마도 더 쉽게, 더있다 당신이 가지고있는 문제를 해결하기위한 파이썬 적 방법. 이 같은 모듈함으로써 것, 그렇지 않으면 동일 객체 구조의 측면에서 기능적으로이 작업을 수행 할 어떻게 주석, 다음은

a.py

class A(object): 

    @property 
    def obj(self): 

     return a_inst 


a_inst = A() 

이것은 다소 추한 구조를 만들 않습니다를 from a import A 그것을 사용하는 코드에서,하지만 그것을 구현하는 덜 복잡한 방법입니다.

+2

나는 실제로 이것도 게시하는 것에 대해 생각했다. 그 이유는 대부분 메타 클래스에 대해 배우기 시작하고 "이봐 요, 나는 이걸 메타 클래스로 해결할 수 있었기 때문입니다!" – mgilson

+0

메타 클래스는 특정 사물을위한 훌륭한 도구입니다. 그들은 조금 지나치게 위험하다. 이 경우,''import A '구조체의 중복성을 정말로 싫어하기 때문에''cls.obj = cls()'나 내가 대답 한''property''보다 더 좋아합니다. 더 자주 구현을 조정하고 클래스를 레벨 1 또는 2를 계층 구조 위로 밀어 넣음으로써 두 가지 문제를 피할 수 있습니다. –

+0

@DanielRoseman은 두 번째 코드가'class A (object) : pass' 모듈에서'a'와'obj'가'a.obj'가 될 것을 의미한다고 생각합니다. 그렇지 않으면'@ property'보다 이점이 없습니다. 내 코드 – jamylak

1

클래스 인스턴스가 생성되기 전에이 클래스 멤버가 필요합니까? 아니, 당신은 첫 번째 인스턴스가 만들어 질 때 그것을 할당 시도 할 수 있습니다 :

class A (object): 
    obj = None 

    def __init__(self): 
     if A.obj is None: 
      a.obj = A() 
      # or: 
      a.obj = self 
+0

또는'__new__'에서 더 일찍 처리하십시오. –

0

을 나는 당신이 그런 싱글이나 뭐 같은 패턴을 구현하기 위해 노력하고 있기 때문에 그렇게하고 싶은 생각합니다.

당신은 ActiveState의에서 다음 레시피를 읽을 수 있습니다 : 그것은 방법을 설명 http://code.activestate.com/recipes/52558/

그것은 작동하고 일부 코드를 보여줍니다.

관련 문제