Python에서 동적으로 클래스에 속성을 어떻게 추가합니까?

Patricia Arquette
풀어 주다: 2024-11-09 22:40:02
원래의
609명이 탐색했습니다.

How do you add properties to a class dynamically in Python?

클래스에 동적으로 속성을 추가하는 방법

문제

데이터베이스 결과 집합을 모방하는 모의 클래스를 만드는 것이 목표입니다. 예를 들어, 데이터베이스 쿼리가 {'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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿