복붙노트

[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. ==============================

    1.다른 사람들이 언급했듯이, 그들은 descriptors라고 불리는 언어 기능을 사용합니다.

    다른 사람들이 언급했듯이, 그들은 descriptors라고 불리는 언어 기능을 사용합니다.

    실제 속성 객체가 Foo.hello 클래스를 통해 액세스 할 때 반환되는 이유는 속성이 __get __ (self, instance, owner) 특수 메서드를 구현하는 방법에 있습니다. 디스크립터가 인스턴스에서 액세스되면 해당 인스턴스가 적절한 인수로 전달되고 owner는 해당 인스턴스의 클래스입니다.

    반면 클래스를 통해 액세스하는 경우 인스턴스는 None이고 소유자 만 전달됩니다. property 객체는이를 인식하고 self를 반환합니다.

    Descriptors howto 외에도 Language Guide에서 Descriptor 구현 및 Descriptor 호출에 대한 설명서를 참조하십시오.

  2. ==============================

    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. ==============================

    3.프로퍼티는 디스크립터이며, 디스크립터는 클래스 인스턴스의 멤버 일 때 특별히 동작한다. 즉, a가 A 유형의 인스턴스이고 A.foo가 설명자 인 경우 a.foo는 A.foo .__ get __ (a)와 동일합니다.

    프로퍼티는 디스크립터이며, 디스크립터는 클래스 인스턴스의 멤버 일 때 특별히 동작한다. 즉, a가 A 유형의 인스턴스이고 A.foo가 설명자 인 경우 a.foo는 A.foo .__ get __ (a)와 동일합니다.

  4. ==============================

    4.속성 개체는 설명자 프로토콜을 구현합니다. http://docs.python.org/howto/descriptor.html

    속성 개체는 설명자 프로토콜을 구현합니다. http://docs.python.org/howto/descriptor.html

  5. from https://stackoverflow.com/questions/6193556/how-do-python-properties-work by cc-by-sa and MIT license