>백엔드 개발 >파이썬 튜토리얼 >Python의 속성 설명자에 대한 자세한 소개(코드 예)

Python의 속성 설명자에 대한 자세한 소개(코드 예)

不言
不言앞으로
2018-12-12 10:37:112868검색

이 글은 파이썬의 속성 설명자에 대한 자세한 소개(코드 예제)를 제공합니다. 특정 참조 값이 있으므로 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

초보자로서 매일매일 꾸준히 책을 읽고 지식을 배우고 있습니다. 오늘은 좋은 점을 소개해 드리겠습니다. 속성 설명자

속성 설명자란 무엇인가요?

사실 클래스에 구현된 set__, __get__, __delete 중 모든 마법 함수는 속성 설명자입니다.

다음으로 속성 설명자를 정의합니다.

class IntegerField:
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass
class User:
    high= IntField()

__get__: 클래스나 인스턴스로 이 속성을 호출하면 __get__ 함수의 결과가 반환됩니다.
__set__: instance를 사용하여 속성 값을 설정할 때 Python은 이 함수를 호출합니다. 수업에는 제한이 없습니다.
__delete__: Python은 인스턴스를 사용하여 속성을 삭제하려고 할 때 이 함수를 호출합니다. 수업에는 제한이 없습니다.
이걸 어떻게 사용하나요? 다음으로, 속성 설명자를 사용하여 속성에 특정 논리를 첨부할 수 있도록 위 코드를 수정하겠습니다.

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("请输入一个整数")
        self.value=value
        
    def __delete__(self, instance):
        pass
class User:
    high=IntegerField() 
#验证代码
if __name__ == '__main__':
    user=User()
    user.high='175'    #报错,ValueError:请输入一个整数
    User.high=175    #正确执行,不报错

.
실제로 속성 설명자 아래에도
1로 나누어져 있습니다. 데이터 설명자: __set__ 구현, __get__

if __name__ == '__main__':
    user=User()
    user.high=175
    print(user.__dict__)    #high是不放入__dict__中的,优先查找数据描述符中的值
    user.__dict__["high"]="abc"    #这样赋值时可以的,并且可以放入__dict__中
    print(user.high)    #会报错,因为在调用__get__方法时并没有value属性

2 비데이터: __get__을 구현하지만 __set__

class NonField:
    def __init__(self, high=170):
        self.value = high

    def __get__(self, instance, owner):
        return self.value


class User:
    high = NonField()


if __name__ == '__main__':
    user = User()
    user.high = '175'    #会放入user.__dict__中
    print(user.__dict__)

을 구현하지 않습니다.

위 내용은 Python의 속성 설명자에 대한 자세한 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제