2010-04-14 4 views
11

누군가 처음 4 줄을 단어로 설명 할 수 있습니까? 나는 수업과 방법에 대해 읽었다. 그러나 여기에서는 매우 혼란스러워 보입니다.클래스, dict, self, init, args?

The Dynamic dict

attrdict 클래스를 활용하는 개체의 __dict__이 사전에 설정 한 후 사전에서 상속와의 :

+0

메모리를 누출하는 좋은 방법입니다. 설명과 더 나은 대안을 보려면 http://bugs.python.org/issue1469629를 참조하십시오. –

답변

5

예제에서는 위치 인수를 사용하지 않습니다. 그래서 관련 코드는 다음과 같습니다 첫 번째 줄에서

class attrdict(dict): 
    def __init__(self, **kwargs): 
     dict.__init__(self, **kwargs) 
     self.__dict__ = self 

당신이 dict의 서브 클래스로 클래스 attrdict을 정의합니다. 두 번째 줄에서는 인스턴스를 자동으로 초기화하는 함수를 정의합니다. 키워드 인수 ( **kargs)를이 함수에 전달합니다. 당신이 a를 인스턴스화하는 경우 : 당신이 실제로 호출

a = attrdict(x=1, y=2) 

attrdict.__init__(a, {'x':1, 'y':2}) 

DICT 인스턴스 핵심 초기화는 dict 내장 슈퍼 클래스를 초기화하여 수행됩니다. 이것은 attrdict.__init__에 수신 된 매개 변수를 전달하는 세 번째 행에서 수행됩니다. 따라서 ,

dict.__init__(self,{'x':1, 'y':2}) 

self (인스턴스 a) 사전을 만드는 :

self == {'x':1, 'y':2} 

좋은 점은 마지막 줄에서 발생합니다 각 인스턴스가 그 속성을 잡고 사전을 가지고 있습니다. 이것은 self.__dict__ (즉,a.__dict__). 우리가 a.x 또는 a.y를 작성하고 각각 값 1 또는 2를 얻을 수

a.__dict__ = {'x':1, 'y':2} 

예를 들어

.

그래서,이 라인 4가하는 일입니다 : 그럼 난 a.xa.y를 호출 할 수 있습니다

a.__dict__ = a where a = {'x':1, 'y':2} 

:

self.__dict__ = self 

은 동일합니다.

희망이 너무 지저분하지 않습니다.

+0

허용되는 것보다 좋습니다. – Musaffa

4

여기 __dict__을 설명하는 좋은 기사입니다. 따라서 모든 속성 액세스는 상위 사전 (즉, 상속받은 dict 클래스)에 대해 발생합니다.

기사의 나머지 부분도 이해 파이썬 객체에 대한 꽤 좋은 :

Python Attributes and Methods

7

라인 별 설명에서 내 샷 :

class attrdict(dict): 

이 줄은 클래스를 선언합니다 내장 dict 클래스의 하위 클래스로 attrdict.

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs) 

이것은 표준 __init__ 방법입니다. dict.__init__(...)에 대한 호출은 수퍼 클래스 (이 경우, dict) 생성자 (__init__) 메소드를 사용하는 것입니다.

마지막 줄인 self.__dict__ = self을 사용하면 __init__ 메서드로 전달되는 키워드 인수 (kwargs)에 속성 (예 : 아래 코드에서 a.x, a.y)을 사용할 수 있습니다.

혼란을 해결하는 데 도움이되기를 바랍니다.

+0

'__init__ '을 수정해야합니다. 그들 주위에 backticks를 넣으면, 그들은 내 '__init__'처럼 보일 것입니다. –

+0

도움이 많이 있습니다. 고맙습니다! – kame