Python类属性详解:@property装饰器与三种操作方式
本文深入解析Python类属性的概念与操作方式。重点介绍使用@property装饰器实现getter、setter和deleter功能,以及通过实例直接访问和内置函数操作属性的方法。通过具体代码示例说明如何控制属性取值、防止随意修改,并澄清实例与类属性的关系,帮助开发者掌握Python属性的高级应用技巧。
Python类属性概述
首先明确属性的基本定义。
在Python中,属性本质上是普通方法的衍生形式。
操作类属性主要包含以下三种方法:
第一种方法是利用@property装饰器来操作类属性。
第二种方法是直接通过类或实例对象来操作属性,例如使用obj.name读取、obj.age=18赋值或del obj.age删除。
第三种方法是调用Python内置的相关函数来操作属性。
探讨属性存在的实际意义:
第一点,访问属性时可以营造出与访问数据字段完全相同的假象。由于属性由方法衍生而来,若Python没有属性机制,普通方法完全可以替代其功能。
第二点,定义属性允许动态获取特定属性值,因为属性值由对应的方法逻辑实现,这使得应用场景更加灵活。
第三点,可以制定自定义的属性规则,从而防止他人随意修改属性值,增强数据安全性。
类属性的三种操作方法
接下来详细阐述上述三种操作类属性的具体实现方式:
使用@property装饰器
第一种方式:使用@property装饰器操作类属性。
在定义时,需在普通方法基础上添加@property装饰器;该属性方法仅包含self参数,调用时无需添加括号。
该方法的优势如下:
1) @property装饰器能够实现其他编程语言中常见的getter、setter和deleter功能,例如实现获取、设置和删除隐藏属性的操作。
2) 借助@property装饰器,可以对属性的读取和赋值过程进行严格控制,进而提升代码的稳定性。
代码实例演示
实例代码1展示如下:
#encoding=utf-8
class Goods(): #新式类
@property
def price(self): #查看属性值
print ('@property ')
@price.setter #修改、设置属性
def price(self, value):
print ('@price.setter' )
@price.deleter#删除属性
def price(self):
print ('@price.deleter')
obj = Goods(50)
obj.price# 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 2000 # 自动执行 @price.setter 修饰的 price 方法,并将2000赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
结果输出:
@property
@price.setter
@price.deleter
实例代码2演示如何通过@property装饰器对属性的取值和赋值施加控制:
class Goods(object):
def __init__(self):
self.value=50
@property
def price(self): # 查看属性
return self.value
@price.setter # 添加或设置属性(属性名.setter)
def price(self, value):
if value >=50 and value<=100: #对属性的取值和赋值加以控制
self.value=value
print (self.value)
else:
print ("请输入一个50到100之间的数!")
@price.deleter # 删除属性(属性名.deleter) 注意:属性一旦删除,就无法设置和获取
def price(self):
del self.value
print ("price is deleted!")
obj = Goods()
print (obj.price) # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price=106 # 自动执行 @price.setter 修饰的 price 方法,并将106 赋值给方法
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
结果输出:
50
请输入一个50到100之间的数!
price is deleted!
实例与类属性关系分析
扩展实例分析:
class Dog(object):
name = 'dog'
def init(self):
self.age = 18
d1 = Dog()
d2 = Dog()
这里引入两个实例d1和d2进行说明。
d1.name # 输出 dogd2.name # 输出 dogd1.name = 'abc'
d1.name # 输出 abcd2.name # 输出 dogDog.name # 输出 dog
原因在于d1.name输出dog并非因为该实例共享了类属性,而是因为该实例自身没有dog属性,Python因此查找并返回了类属性。然而,一旦执行d1.name的修改操作,相当于给d1实例绑定了name属性,此后d1.name便与类属性无关。既然涉及赋值即绑定属性,d1.name与d2.name的含义及值便不再相同,显然它们的数据并未共享。
至此,关于Python类属性的介绍结束,更多相关内容可搜索本站过往文章或继续浏览后续文章,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













