2017-10-03 1 views
4

파이썬에서는 이전에 정의한 클래스 C에 속성을 추가 할 수 있습니다. 그러나, 나는 list에 속성을 추가 할 수 없습니다 - 결과 오류 메시지는 설명이 있음을 list가 내장 된 타입이기 때문에 : 마찬가지로파이썬에서 동적으로 추가 된 속성을 가질 수있는 객체는 무엇입니까?

>>> class C: pass 
... 
>>> C.foo = 1 
>>> C.foo 
1 

>>> list.foo = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'list' 

, C의 인스턴스에 속성을 추가 할 수 있지만, list의 인스턴스가 아닙니다. 그러나이 경우, 오류 메시지가 훨씬 더 모호 :

>>> o = C() 
>>> o.bar = 2 
>>> o.bar 
2 

>>> o = [] 
>>> o.bar = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'list' object has no attribute 'bar' 

이유는 list의 인스턴스에 구성원을 추가 할 수 없습니다? list은 내장형이기 때문에 다시 나타 납니까?

더 일반적으로 파이썬의 어떤 객체가 동적으로 추가 된 속성을 가질 수 있습니까?

+0

inbuilt 유형이 아닌 것으로 추측합니다. –

+0

매우 관련이 있습니다. https://stackoverflow.com/questions/6738987/extension-method-for-python-built-in-types –

답변

1

개체에 임의의 속성을 설정하면 개체의 __dict__이 효과적으로 변경됩니다. __dict__은 개체의 모든 구성원을 저장하는 사전입니다. 따라서 개체를 개체에 추가하려면 다음 두 조건이 있습니다.

  1. 개체에 __dict__이 있어야합니다.
  2. 개체의 __dict__은 변경 가능해야합니다.

이러한 조건 중 하나가 틀린 이유는 여러 가지가 있습니다. 유형의 다음과 같은 범주가 일반적으로 개체의 수정을 허용하지 않는 것입니다

  • 내장 그 나라의 개체 정의에 구운 네이티브 코드로 구현과 회원의 고정 세트를 가지고 있습니다 기본 유형. 예를 들면 int, str, list, bytes을 포함 ... 예를 NumPy와 물건에 대한 외부 라이브러리에서 아마 대부분 (전부는 아니지만) built-in types
  • 기본 유형.
  • __slots__을 사용하는 파이썬 클래스. 슬롯은 __dict__을 돌려서 고정 된 멤버 세트로 바꾸는 명시적인 방법입니다. 이렇게 분명히, 이것은 나중에 (디자인 당) 객체에 대한 추가를 막을 것입니다.

개체를 수정할 수 있는지 여부를 확인하는 좋은 방법은 무엇입니까? 위에서 조건을 확인하십시오. 객체가 __dict__를 가지고 여부 :

짧은에서
>>> isinstance(Example().__dict__, dict) 
True 
>>> isinstance(list.__dict__, dict) 
False 
0

, 그것은 __setattr__ 마법 방법에 따라 달라집니다

>>> class Example: 
     pass 
>>> class SlotsExample: 
     __slots__ = ['x'] 

>>> hasattr(Example(), '__dict__') 
True 
>>> hasattr(SlotsExample(), '__dict__') 
False 
>>> hasattr(list, '__dict__') 
True 
>>> hasattr([], '__dict__') 
False 

그리고를 __dict__ 실제 사전인지.

파이썬 속성은 __getattr____setattr__을 통해 검색됩니다. 클래스가없는 클래스의 경우 기본값이 적용됩니다. (슬롯은 조금 다릅니다.)

내장/확장 유형 (CPython에서 HEAPTYPE)의 경우 기본적으로 다른 속성을 추가 할 수는 없지만 다른 기능을 제공하여 재정의 할 수는 있습니다. (순수 Python에서는 불가능합니다.)

관련 문제