2014-07-24 3 views
1
class A(): 
    # A not inherit from object 
    pass 

a = A() 

print 'a.__dict__ : ', a.__dict__ # {} 
print 'dir(a) : ', dir(a) # ['__doc__', '__module__'] 
print 'dir(A) : ', dir(A) # ['__doc__', '__module__'] 

1.First 질문은, a.__dict__ '는이'__dict__ 속성이 있음을 증명하지만, 디렉토리 후 (a) 또는 디렉토리 (A), __dict__를 찾을 수없는 곳 ATTR __dict__입니다 ?파이썬 내장 속성이 __dict__에 대한 혼란과 __setattr__

# next i tried to give the 'a' attribute 'test' whose value is 1 in 3 diff ways 
a.test = 1 # fine! 
setattr(a, 'test', 1) # it works! 
a.__setattr__('test', 1) # Attribute Error raised,'a' has no attr __setattr__ 

2.As 나는 a.test = 1setattr(a, 'test', 1) 실제로 속성을 설정하는 __setattr__ 메소드를 호출 알고 test 나누었다 디렉토리에는 __setattr__ (a)는 저놈이 어떻게 할 이제 왜? a.__setattr__ 인상 오류가 없다가 a.testsetattr(a, 'test', 1) 어떤 조언과 제안을 주시면 감사하겠습니다. 특히 두 번째 질문에 감사드립니다.

+0

'setattr' 메소드가 instancemethod'__setattr__'을 줄 수 있다고 생각하십니까? – LeoTao

+2

[documentation] (https://docs.python.org/2/library/functions.html#dir)을 읽으셨습니까? 특히 * "엄격하게 정의 된 이름 집합을 제공하려고 시도하는 것보다 더 재미있는 이름 집합을 제공하려고합니다."*. – jonrsharpe

+1

__ doc__ 및 __ module__은 .__ dict__에 포함되지 않고 .__ dict__에 포함됩니다. – mdurant

답변

1
  1. .__dict__의 인스턴스를 만들 수하기 위해 __new__ 또는 __init__를 정의 할 필요가 없습니다 것은 "메타 속성"의 종류는 일반적으로 모든 속성을 넣어 저장이입니다 . 따라서 특별한 역할을하기 때문에 dir(...)에 나타나지 않습니다. 존재하는 경우
  2. 그들은 단지 .__setattr__() 전화; 그렇지 않은 경우 각 속성은 .__dict__에 설정됩니다.
+0

이 두 번째 질문에 대해, 당신은 __setattr__''없이 단지 __dict__''로 설정됩니다 속성을 의미, 감사합니다,하지만 어떻게?이 메서드를 호출하지 않습니다 @mdurant? 포인트를 잡은 생각하지 않는다 @ glglgl – LeoTao

+0

@LeoTao 아니요, 내부적으로 내장되어 있습니다. – glglgl

0

__setattr__ 등이 있으며 속성 설정 방법을 사용자 정의 할 수 있으며 다른 많은 "마법"방법과 유사하게 사용자 정의 할 수 있습니다. 예를 들어, A.

+1

난 당신이 정말 – LeoTao

관련 문제