> 백엔드 개발 > 파이썬 튜토리얼 > Python 설명자 사용법 소개(예제 포함)

Python 설명자 사용법 소개(예제 포함)

不言
풀어 주다: 2019-03-16 09:44:55
앞으로
2524명이 탐색했습니다.

이 글은 Python 설명자 사용법을 소개합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

파이썬 사용자로서 한동안 파이썬을 사용하셨을 수도 있지만, 파이썬에서 디스크립터를 사용해본 적이 없으실 수도 있습니다. 다음은 디스크립터 사용법에 대한 소개입니다

시나리오 소개

디스크립터를 소개하기 위해 먼저 매우 간단한 클래스를 디자인합니다:

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price
로그인 후 복사

이것은 상품의 이름, 수량 및 가격을 저장하는 상품 클래스입니다.

제품의 경우 일반적으로 수량과 가격이 음수가 되지 않을 것으로 예상합니다. 이러한 상황을 피하기 위해 초기화 중에 다음과 같은 몇 가지 판단을 추가할 수 있습니다.

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        if quantity<0:
            raise ValueError(&#39;quantity must be >= 0&#39;)
        self.quantity = quantity
        if quantity<0:
            raise ValueError(&#39;price must be >= 0&#39;)
        self.price = price
로그인 후 복사

하지만 여전히 한 가지 단점이 있습니다. 그러한 판단은 초기화 중에만 추가되고 나중에 클래스 인스턴스에 속성을 할당할 때 할당된 값이 0

보다 크다는 보장은 없습니다

그래서 '기능'을 사용하여 이 문제를 해결할 수 있습니다 :

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price

    @property
    def quantity(self):
        return self._quantity

    @quantity.setter
    def quantity(self,value):
        if value < 0:
            raise ValueError(&#39;quantity must be >= 0&#39;)
        else:
            self._quantity = value

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value < 0:
            raise ValueError(&#39;price must be >= 0&#39;)
        else:
            self._price = value

book = Product(&#39;mybook&#39;,6,30)
print(book.quantity)
로그인 후 복사

여기에서 @property와 @quantity.setter는 두 가지 데코레이터로 속성 읽기 및 쓰기를 설정할 수 있습니다. 이는 속성 읽기 및 쓰기와 동일하지만 실제로는 특성에 대한 구체적인 소개를 위해 함수를 실행합니다. 여기서는 주로 설명자를 끌어내기 위해 직접 작성합니다.

기능을 사용하면 속성에 값을 할당할 때 판단력을 더할 수 있습니다. 그러나 클래스에 더 많은 속성이 있고 많은 속성에 음수가 아닌 할당에 대한 검사도 추가해야 하는 경우 속성을 사용하는 것이 너무 번거롭고 코드 중복도 많이 발생하며 많은 데코레이터가 추가됩니다. 설명자를 사용하여 이 문제를 해결할 수 있습니다.

디스크립터 사용하기

먼저 디스크립터의 개념을 살펴보겠습니다

디스크립터는 "바인딩 동작"을 갖는 객체 속성입니다. 디스크립터 프로토콜에서는 메서드 채우기 속성을 통해 액세스할 수 있습니다. 이러한 메소드에는 get(), set() 및 delete()가 포함됩니다. 이러한 메소드 중 하나라도 객체에 정의되면 객체는 설명자입니다

(이 메소드는 특수 메소드이므로 이중 밑줄은 표시로 인해 변환되지 않습니다. )

먼저 디스크립터 사용에 따라 위의 product 클래스를 수정합니다.

class NotNegative():
    def __init__(self,name):
        self.name = name

    def __set__(self, instance, value):
        if value < 0:
            raise ValueError(self.name+&#39; must be >= 0&#39;)
        else:
            instance.__dict__[self.name] = value

class Product():
    quantity = NotNegative(&#39;quantity&#39;)
    price = NotNegative(&#39;price&#39;)

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price

book = Product(&#39;mybook&#39;,2,5)
로그인 후 복사

NotNegative는 Product 클래스의 클래스 속성인 디스크립터 클래스입니다.

이 예에서 book.Quantity=3이 실행되면, 인터프리터는 먼저 인스턴스 속성을 찾아 수량 속성이 있음을 발견하지만, 설명자인 클래스 속성도 있음을 발견하므로 결국 설명자 경로를 선택하게 됩니다. 그러면 디스크립터이기 때문에 디스크립터에 설정된 특수 메소드가 실행됩니다.

디스크립터의 set 특수 메소드의 매개변수는

self: 디스크립터 인스턴스입니다.

instance: 예제의 인스턴스 북과 동일합니다.

value: 할당할 값입니다.

왜냐하면 이러한 속성은 값을 취하는 데 매우 중요합니다. 특별한 요구 사항이 없으므로 예제에서는 get 특수 메소드가 구현되지 않습니다.

get 메소드에는 self, 인스턴스, 소유자라는 3개의 매개변수도 있습니다. self, 인스턴스는 set의 것과 동일하고, 예제에서는 owner가 Product 클래스입니다

다음으로 설명자 set 메서드의 else 부분에서 수행되는 작업을 주로 살펴보겠습니다

instance.__dict__[self.name] = value
로그인 후 복사

의 dict를 호출하여 책 인스턴스에서는 dict의 속성에 값을 직접 할당하는데, 이는 매개변수의 인스턴스를 전달하는 중요한 이유이기도 합니다. 디스크립터 객체는 클래스 속성으로 존재하므로 이 클래스의 여러 객체에 접근할 수 있으므로 속성 덮어쓰기를 방지하기 위해 인스턴스의 속성에 직접 저장하는 것이 적절하다. 하지만 여기서는 속성에 값을 할당할 수 있는 방법이 없습니다. 그렇지 않으면 무한 루프에 빠지게 됩니다.

데이터 설명자 및 비데이터 설명자의 경우 클래스가 get() 메서드만 정의하고 set(), delete() 메서드는 정의하지 않으면 비데이터 설명자로 간주됩니다. 그렇지 않으면 데이터 설명자가 됩니다.

🎜마지막으로 이 글에서는 디스크립터의 사용법을 간략하게 소개하고 설명합니다. 좀 더 깊이 있는 이해가 필요하다면 "Fluent Python"의 속성 디스크립터 섹션을 참조하세요.

위 내용은 Python 설명자 사용법 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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