2011-05-10 4 views
11

동적 속성이 엉망이었고 object() 클래스에서 직접 객체를 만든 경우 __dict__ 속성을 사용할 수 없다는 것을 알았지 만 개체의 직접적인 자손 인 새 클래스를 만듭니다. __dict__ 특성에 액세스 할 수 있습니다. 차이점은 무엇입니까?Python의 차이점은 __dict__에서 object()와 class myClass (객체) 사이의 차이입니다.

예 :

# This gives an AttributeError 
o = object() 
o.__dict__ 
# This works: prints {} 
class myClass(object): 
    pass 
o = myClass() 
o.__dict__ 
+0

'__dict__ '을 직접 사용하는 것은 거의 항상 불필요하며 나쁜 생각입니다. 동적 속성 이름은 일반적으로 사전 키로 더 잘 수행되지만, 경우에 따라 정당화 될 수 있습니다.하지만 그 경우에는'setattr'을 사용할 수 있습니다. – delnan

답변

8

object는 C로 구현되며 __dict__ 특성이 없다. (모든 파이썬 객체가 가지고있는 것은 아니며, __slots__을 찾는다.)

+0

@Jamie'myClass' 인스턴스로 할 수있는 동안'object()'를 통해 얻은 인스턴스에 임의의 속성을 할당 할 수 없다는 것에 유의하십시오. 실제로 다른 클래스의 인스턴스가 아닌'object'의 인스턴스로 할 수있는 일은 많지 않습니다. – Ben

1

나는 왜 그것이 당신의 수업에는 효과가 있지만 원래의 object 클래스는 아닌지 잘 모르겠습니다. 클래스가 초기화 될 때 __dict__가 생성된다고 가정합니다.

이 코드를 사용 :

class Test(object): 
    def __init__(self): 
     pass 

def main(): 
    print 'OBJECT:', dir(object()) 
    print 
    print 'TEST:', dir(Test()) 
    return 

이 출력 해낸 :

OBJECT: ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__'] 

TEST: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__'] 

당신이 볼 수 있듯이, __dict__, __module__ 및 __weakref__ 테스트 객체에 있지만 기본 오브젝트

+2

이것은 Python의 고유 한 부분입니다. 클래스 정의에 따라 __dict__ 속성을 제공할지 여부를 결정할 수 있습니다 (인스턴스를 남기지 않고 남겨둔 채로). __dict__는 기본적으로 인스턴스에 포함되어 있으므로 제공하지 않으려면 클래스 정의 시간에 특별히 조치해야합니다. – ncoghlan

관련 문제