데이터베이스 결과 집합을 모방하는 모의 클래스를 만드는 것이 목표입니다. 예를 들어, 데이터베이스 쿼리가 {'ab':100, 'cd':200}를 반환하면 다음이 표시될 것으로 예상됩니다.
>>> dummy.ab 100
클래스는 동적으로 가능하므로 클래스 자체에 추가해야 합니다.
>>> class Foo(object): ... pass ... >>> foo = Foo() >>> foo.a = 3 >>> Foo.b = property(lambda self: self.a + 1) >>> foo.b 4
속성은 설명자의 간단한 구현입니다. 이는 특정 클래스에 대한 사용자 정의 속성 처리를 제공하는 객체입니다. 이는 __getattribute__의 광범위한 if 트리를 대체하는 역할을 합니다.
foo.b를 요청하면 Python은 클래스에 정의된 b가 설명자 프로토콜을 따른다는 것을 인식합니다. 이는 단순히 가 있는 객체를 나타냅니다. get__, __set__ 또는 __delete 메소드. 설명자는 해당 속성을 처리하는 책임을 맡고 Python이 Foo.b.__get__(foo, Foo)를 호출하도록 유도하며, 반환 값은 속성 값으로 사용자에게 반환됩니다. 속성의 경우 이러한 각 메서드는 단순히 속성 생성자에 제공한 fget, fset 또는 fdel을 호출합니다.
설명자는 전체 OO 구현의 복잡성을 노출하기 위한 Python의 메커니즘입니다. 그런데 재산보다 훨씬 더 널리 퍼져 있는 특별한 유형의 기술자가 있습니다.
>>> class Foo(object): ... def bar(self): ... pass ... >>> Foo().bar <bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>> >>> Foo().bar.__get__ <method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>
겸손한 방법은 또 다른 유형의 기술자입니다. get은 호출 인스턴스 앞에 첫 번째 인수를 붙입니다. 본질적으로 다음과 같은 작업을 수행합니다.
def __get__(self, instance, owner): return functools.partial(self.function, instance)
설명자는 클래스에만 적용되는 이유일 수 있습니다. 설명자는 우선 클래스를 뒷받침하는 메커니즘을 공식화합니다. 이는 규칙의 예외입니다. 클래스 자체가 유형 인스턴스임에도 불구하고 설명자를 클래스에 할당할 수 있다는 것은 의심할 여지가 없습니다. 실제로 Foo.bar를 검색하려고 하면 여전히 property.__get__이 호출됩니다. 그러나 설명자는 클래스 특성으로 액세스할 때 자체적으로 반환하는 것이 관용적입니다.
설명자를 사용하면 대부분의 Python OO 시스템을 Python 자체로 작성할 수 있습니다.
위 내용은 Python에서 동적으로 클래스에 속성을 어떻게 추가합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!