[PYTHON] 파이썬 속성은 어떻게 작동합니까?
PYTHON파이썬 속성은 어떻게 작동합니까?
나는 파이썬 프로퍼티를 성공적으로 사용하고 있지만, 어떻게 작동 하는지를 보지 못했다. 클래스 외부의 속성을 역 참조하면 속성 유형의 개체 만 가져옵니다.
@property
def hello(): return "Hello, world!"
hello # <property object at 0x9870a8>
그러나 클래스에 속성을 넣으면 그 동작은 매우 다릅니다.
class Foo(object):
@property
def hello(self): return "Hello, world!"
Foo().hello # 'Hello, world!'
언 바운드 Foo.hello는 여전히 속성 객체이므로 클래스 인스턴스화가 마법을 수행해야합니다. 그러나 그 마법은 무엇입니까?
해결법
-
==============================
1.다른 사람들이 언급했듯이, 그들은 descriptors라고 불리는 언어 기능을 사용합니다.
다른 사람들이 언급했듯이, 그들은 descriptors라고 불리는 언어 기능을 사용합니다.
실제 속성 객체가 Foo.hello 클래스를 통해 액세스 할 때 반환되는 이유는 속성이 __get __ (self, instance, owner) 특수 메서드를 구현하는 방법에 있습니다. 디스크립터가 인스턴스에서 액세스되면 해당 인스턴스가 적절한 인수로 전달되고 owner는 해당 인스턴스의 클래스입니다.
반면 클래스를 통해 액세스하는 경우 인스턴스는 None이고 소유자 만 전달됩니다. property 객체는이를 인식하고 self를 반환합니다.
Descriptors howto 외에도 Language Guide에서 Descriptor 구현 및 Descriptor 호출에 대한 설명서를 참조하십시오.
-
==============================
2.@properties가 제대로 작동하려면 클래스가 object의 서브 클래스 여야합니다. 클래스가 객체의 하위 클래스가 아니면 처음으로 setter에 액세스하려고하면 실제로 setter를 통해 액세스하는 대신 짧은 이름으로 새 속성을 만듭니다.
@properties가 제대로 작동하려면 클래스가 object의 서브 클래스 여야합니다. 클래스가 객체의 하위 클래스가 아니면 처음으로 setter에 액세스하려고하면 실제로 setter를 통해 액세스하는 대신 짧은 이름으로 새 속성을 만듭니다.
다음은 올바르게 작동하지 않습니다.
class C(): # <-- Notice that object is missing def __init__(self): self._x = None @property def x(self): print 'getting value of x' return self._x @x.setter def x(self, x): print 'setting value of x' self._x = x >>> c = C() >>> c.x = 1 >>> print c.x, c._x 1 0
다음은 올바르게 작동합니다.
class C(object): def __init__(self): self._x = None @property def x(self): print 'getting value of x' return self._x @x.setter def x(self, x): print 'setting value of x' self._x = x >>> c = C() >>> c.x = 1 setting value of x >>> print c.x, c._x getting value of x 1 1
-
==============================
3.프로퍼티는 디스크립터이며, 디스크립터는 클래스 인스턴스의 멤버 일 때 특별히 동작한다. 즉, a가 A 유형의 인스턴스이고 A.foo가 설명자 인 경우 a.foo는 A.foo .__ get __ (a)와 동일합니다.
프로퍼티는 디스크립터이며, 디스크립터는 클래스 인스턴스의 멤버 일 때 특별히 동작한다. 즉, a가 A 유형의 인스턴스이고 A.foo가 설명자 인 경우 a.foo는 A.foo .__ get __ (a)와 동일합니다.
-
==============================
4.속성 개체는 설명자 프로토콜을 구현합니다. http://docs.python.org/howto/descriptor.html
속성 개체는 설명자 프로토콜을 구현합니다. http://docs.python.org/howto/descriptor.html
from https://stackoverflow.com/questions/6193556/how-do-python-properties-work by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 round ()가 제대로 반올림되지 않는 것 같습니다. (0) | 2018.10.03 |
---|---|
[PYTHON] 파이썬에서 문자열의 반복 된 문자 계산하기 (0) | 2018.10.03 |
[PYTHON] 파이썬에서리스트에서 중복을 제거하는 가장 빠른 알고리즘은 무엇입니까? 그래서 모든 요소가 순차적으로 * 보존됩니다 *. [복제] (0) | 2018.10.03 |
[PYTHON] 파이썬에서 XML 문자열을 사전으로 변환하는 방법은 무엇입니까? (0) | 2018.10.03 |
[PYTHON] 파이썬 '자체'변수를 초급자에게 설명하기 [duplicate] (0) | 2018.10.03 |