Python 데코레이터의 @property에 대한 간략한 분석

풀어 주다: 2023-07-25 16:18:17
앞으로
1411명이 탐색했습니다.

1. @property

클래스 메소드를 클래스 속성으로 변환하여 속성 값을 직접 얻거나 속성에 값을 할당하는 데 사용할 수 있습니다.

사례 분석

예:

class Exam(object):
    def __init__(self, score):
        self._score = score


    def get_score(self):
        return self._score


    def set_score(self, val):
        if val < 0:
            self._score = 0
        elif val > 100:
            self._score = 100
        else:
            self._score = val


e = Exam(60)
print(e.get_score())


e.set_score(70)
print(e.get_score())
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석

코드 분석:

은 _의 직접적인 조작을 피하기 위해 시험 클래스를 정의합니다. 점수 속성, get_score 제공 및 set_score 메소드는 외부에 노출되기를 원하지 않는 일부 속성을 숨겨주는 캡슐화 역할을 하며, 사용자가 조작할 수 있는 메소드만을 제공하며, 매개변수의 합리성 등을 확인할 수 있습니다.

Python은 속성 데코레이터를 제공합니다. 데코레이팅된 메서드는 '속성'으로 사용할 수 있습니다.

예:

class Exam(object):
    def __init__(self, score):
        self._score = score


    @property
    def score(self):
        return self._score


    @score.setter
    def score(self, val):
        if val < 0:
            self._score = 0
        elif val > 100:
            self._score = 100
        else:
            self._score = val




e = Exam(60)
print(e.score)


e.score = 90
print(e.score)


e.score = 200
print(e.score)
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석

참고:

메서드 점수에 @property를 추가하면 점수를 속성으로 사용할 수 있습니다. , 데코레이팅된 메서드를 할당용 속성으로 바꿀 수 있습니다.

또한 Score.setter 데코레이터를 사용할 필요가 없습니다. 이 때 Score는 읽기 전용 속성이 됩니다.

class Exam(object):
    def __init__(self, score):
        self._score = score


    @property
    def score(self):
        return self._score


e = Exam(60)
print(e.score)
e.score = 200  # score 是只读属性,不能设置值
print(e.score)
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석


二、@property的力量

python处理上述问题的方法是使用property。可以这样来实现它。

例 :

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature


    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32


    def get_temperature(self):
        print("获得的值")
        return self._temperature


    def set_temperature(self, value):
        if value < -273:
            raise ValueError("零下273度是不可能的")
        print("设定值")
        self._temperature = value


    temperature = property(get_temperature,set_temperature)
로그인 후 복사

并且,一旦运行,在shell中发出以下代码。

c = Celsius()
print(c.temperature)
로그인 후 복사

创建对象时,将调用init ()方法。此方法的线为self.temperature = temperature。

此分配自动称为set_temperature()。

Python 데코레이터의 @property에 대한 간략한 분석

2. 属性的作用。

任何访问如c.temperature都会自动调用get_temperature()。

例:

c.temperature = 37
print(c.temperature)
print(c.to_fahrenheit())
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석

注:

温度值存储在私有变量_temperature中。temperature属性是一个属性对象,它提供了与此私有变量的接口。


三、深入了解property

在Python中,property()是一个内置函数,用于创建并返回属性对象。

语法

property(fget=None, fset=None, fdel=None, doc=None)
로그인 후 복사

参数解析

fget为获取属性值的函数,fset为设置属性值的函数,fdel为删除属性的函数,doc为字符串(如注释)。从实现中可以看出,这些函数参数是可选的。

可以简单地按照以下方式创建属性对象。

property(fget=None, fset=None, fdel=None, doc=None)
print(property())
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석

1. 属性对象有三个方法,getter()、setter()和deleter()。

语法:

temperature = property(get_temperature,set_temperature)
로그인 후 복사

用于稍后指定fget、fset和fdel。

# 创建空属性
temperature = property()
# 设置 fget
temperature = temperature.getter(get_temperature)
# 设置 fset
temperature = temperature.setter(set_temperature)
로그인 후 복사

注:

这两段代码是等效的。

不定义名称get_temperature,set_temperature。

因为它们是不必要的,并且会影响类命名空间。为此,在定义getter和setter函数时重用了名称temperature。

2. 案例

例:

class Celsius:
    def __init__(self, temperature = 0):
        self._temperature = temperature


    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32


    @property
    def temperature(self):
        print("获得值")
        return self._temperature


    @temperature.setter
    def temperature(self, value):
        if value < -273:
            raise ValueError("零下273度是不可能的")
        print("零下273度是不可能的")
        self._temperature = value
c=Celsius()
c.temperature = 37
print(c.temperature)
로그인 후 복사

Python 데코레이터의 @property에 대한 간략한 분석

注:

实现是制作属性的简单方法和推荐方法。在Python中寻找属性时,很可能会遇到这些类型的构造。


四、总结

本文基于Python基础,介绍了@property 如何把方法变成了属性。通过案例的分析,代码的展示。介绍了@property的力量,以及提供了相应错误的解决方案处理方法。属性的作用。

위 내용은 Python 데코레이터의 @property에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Go语言进阶学习
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!