在@propertyPython中是一个属性装饰。它可以像访问常规属性一样访问对象的方法:
mass.pounds() ---> mass.pounds
您可以使用属性装饰器为类的方法提供 getter、setter 和 deleter 功能。
装饰器概述
在深入研究 Python 的属性装饰器之前,让我们先简单了解一下什么是装饰器。
在 Python 中,装饰器用@.
装饰器是一种扩展函数或类行为的方法。
简而言之,这段代码:
def extend(func):
return func
@extend
def some_func():
pass
是否与此相同:
def extend(func):
return func
def some_func():
pass
some_func = extend(some_func)
它some_func()通过extend()函数的行为扩展了 的行为。
Python中的@property
将类中的方法标记为@property可以像访问属性一样访问对象的方法:
mass.pounds() ---> mass.pounds
例子
假设您有一个Mass以公斤和磅为单位存储质量的类。
class Mass:
def __init__(self, kilos):
self.kilos = kilos
self.pounds = kilos * 2.205
让我们测试一下它是如何工作的:
mass = Mass(100)
print(mass.kilos)
print(mass.pounds)
输出:
100
220.5
让我们改变公斤的数量,看看磅会发生什么:
mass.kilos = 500
print(mass.pounds)
输出:
220.5
磅数保持不变。这是因为它没有更新。
你可以通过创建一个pounds()方法并去掉pounds属性来解决这个问题。此方法将公斤转换为磅:
class Mass:
def __init__(self, kilos):
self.kilos = kilos
def pounds(self):
return self.kilos * 2.205
现在您可以更改公斤数,磅数将始终保持最新
mass = Mass(100)
print(mass.pounds())
mass.kilos = 500
print(mass.pounds())
输出:
220.5
1102.5
进行此更改后,您将无法再不mass.pounds使用括号进行调用。这是因为pounds()现在是一个方法——而不是一个属性。
如果Mass该类在其他地方使用,则可能会破坏代码。
这就是@property装饰器的帮助所在。
如果你用 标记pounds()方法@property,它允许你mass.pounds再次不带括号调用:
class Mass:
def __init__(self, kilos):
self.kilos = kilos
@property
def pounds(self):
return self.kilos * 2.205
让我们测试一下:
mass = Mass(100)
print(mass.pounds)
mass.kilos = 500
print(mass.pounds)
它就像一个魅力。该pounds()方法现在称为getter方法。它不存储对象中的磅数,但可以通过将公斤转换为磅来获取。
在这个改变之后,如果你能像这样更新磅数不是有意义吗?
mass.pounds = 1000
但是,如果您运行此代码,则会导致错误:
Traceback (most recent call last):
File "main.py", line 9, in <module>
mass.pounds = 1000
AttributeError: can't set attribute
错误说您无法设置该pounds属性。这是合理的,因为pounds()仍然是一个方法,不会在对象中存储磅数。所以只能获取磅数,不能设置。
但是您可以更改公斤数。因此,您可以通过mass.pounds使用setter方法间接更改公斤数。
为了能够设置磅数,请定义一个 setter 方法。这种方法:
采用新的磅数。
将其转换为公斤。
将公斤分配给质量对象。
要将其转换为代码,请添加一个同样命名pounds()为Mass该类的 setter 方法:
@pounds.setter
def pounds(self, pounds):
self.kilos = pounds / 2.205
现在类看起来像这样:
class Mass:
def __init__(self, kilos):
self.kilos = kilos
@property
def pounds(self):
return self.kilos * 2.205
@pounds.setter
def pounds(self, pounds):
self.kilos = pounds / 2.205
您可以测试Mass该类:
mass = Mass(100)
print(mass.kilos)
print(mass.pounds)
mass.pounds = 1100
print(mass.kilos)
print(mass.pounds)
输出:
100
220.5
498.8662131519274
1100.0
现在您可以访问和间接修改pounds.
但是如果你想删除英镑调用del mass.pounds呢?这没有意义,因为pounds没有存储在对象中。
但是您可以为磅创建一个删除器方法,间接删除公斤。
例如,pounds()在Mass类中添加删除器方法:
@pounds.deleter
def pounds(self):
print("Resetting mass!")
self.kilos = 0
在这个删除器中,公斤数被设置为,0并且一条消息被打印到控制台。
这是该Mass课程的最终版本:
class Mass:
def __init__(self, kilos):
self.kilos = kilos
@property
def pounds(self):
return self.kilos * 2.205
@pounds.setter
def pounds(self, pounds):
self.kilos = pounds / 2.205
@pounds.deleter
def pounds(self):
print("Resetting mass!")
self.kilos = 0
它不存储磅数。相反,它具有三种pounds()方法。一种用于间接:
得到磅。
设定磅数。
删除磅。
这些方法中的每一个都间接地修改公斤,但在语法上使用磅。
让我们创建一个最终Mass对象并删除pounds,看看会发生什么:
mass = Mass(100)
del mass.pounds
print(mass.kilos)
print(mass.pounds)
输出:
Resetting mass!
0
0.0
结论
@property 在 Python 中可以调用像属性这样的方法:
mass.pounds() ---> mass.pounds
您可以使用属性装饰器间接修改对象的属性。为此,您需要定义 getter、setter 和 deleter 方法。
欢迎加入QQ群
QQ群名称:Python教程
QQ群号:732484294