Python property装饰器详解与实战案例
本文详细介绍Python中property装饰器的两种定义方式及其参数含义。通过装饰器语法和类属性传参两种方法,展示如何将函数伪装为数据属性,实现访问、设置和删除属性的自动化控制。文中包含BMI计算及姓名管理的完整代码案例,帮助开发者理解属性访问的一致性与封装性。
1.property
装饰器是一种在不修改被装饰对象源代码及调用方式的前提下,为其添加新功能的可调用对象。
property是Python内置的一个装饰器,主要用于将类中的方法绑定为对象的数据属性。
通过应用property装饰器,类中的函数可以被“伪装”成对象的数据属性。当对象访问该特殊属性时,会自动触发相关功能的执行,并将返回值作为访问结果。
使用property能够有效保证属性访问的一致性。此外,它还提供了设置和删除属性的功能接口。
应用场景:当某些功能在语义上更接近数据属性时,Python提供了一种装饰器机制,可以将这种功能属性伪装成数据属性,从而简化调用方式。
2.property属性定义的两种方式
A、装饰器方式
在类的方法上应用@property装饰器,即上述提到的第一种方式。
B、类属性方式
通过创建一个实例对象并赋值给类属性的方式来实现。
>>> class Lemons():
def __init__(self,unit_price=7):
self.unit_price = unit_price
def get_unit_price(self):
return self.unit_price
def set_unit_price(self,new_unit_price):
self.unit_price = new_unit_price
def del_unit_price(self):
del self.unit_price
x = property(get_unit_price, set_unit_price, del_unit_price)
>>> fruit = Lemons()
>>>
>>> fruit.x #调用 fruit.x 触发 get_unit_price
7
>>>
>>> fruit.x = 9 #调用 fruit.x = 9 触发 set_unit_price
>>>
>>> fruit.x
9
>>>
>>> fruit.unit_price #调用 fruit.unit_price 触发 get_unit_price
9
>>> del fruit.x #调用 del fruit.x 触发 del_unit_price
>>>
>>> fruit.unit_price
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
l.unit_price
AttributeError: 'Lemons' object has no attribute 'unit_price'property方法可以接收四个参数,分别对应不同的操作行为。
- 第一个参数是获取属性的方法名,当调用 对象.属性 时自动触发。
- 第二个参数是设置属性的方法名,当给属性赋值时自动触发。
- 第三个参数是删除属性的方法名,当执行删除属性操作时自动触发。
- 第四个参数是字符串类型的描述文档,当调用 对象.属性.doc 时触发。
3.案例
""" 成人的BMI数值标准: 过轻:低于18.5 正常:18.5-23.9 过重:24-27 肥胖:28-32 非常肥胖, 高于32 体质指数(BMI)=体重(kg)÷身高^2(m) 示例:70kg÷(1.75×1.75)=22.86 """
案例一:
class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
# 定义函数的原因1:
# 1、从bmi的公式上看,bmi应该是触发功能计算得到的
# 2、bmi是随着身高、体重的变化而动态变化的,不是一个固定的值
# 说白了,每次都是需要临时计算得到的
# 但是bmi听起来更像是一个数据属性,而非功能
@property
def bmi(self):
return self.weight / (self.height ** 2)
obj1 = People('egon', 70, 1.83)
print(obj1.bmi())
obj1.height=1.86
print(obj1.bmi())
print(obj1.bmi)案例二:
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class People:
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self, val):
if type(val) is not str:
print('必须传入str类型')
return
self.__name = val
def del_name(self):
print('不让删除')
# del self.__name
name=property(get_name,set_name,del_name)
obj1=People('egon')
# print(obj1.get_name())
# obj1.set_name('EGON')
# print(obj1.get_name())
# obj1.del_name()
# 人正常的思维逻辑
print(obj1.name) #
# obj1.name=18
# del obj1.name案例三:
class People:
def __init__(self, name):
self.__name = name
@property
def name(self): # obj1.name
return self.__name
@name.setter
def name(self, val): # obj1.name='EGON'
if type(val) is not str:
print('必须传入str类型')
return
self.__name = val
@name.deleter
def name(self): # del obj1.name
print('不让删除')
# del self.__name
obj1=People('egon')
# 人正常的思维逻辑
print(obj1.name) #
# obj1.name=18
# del obj1.name到此这篇关于Python property装饰器使用案例介绍的文章就介绍到这了,更多相关Python property内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









