类的property特性
程序员文章站
2022-07-11 16:14:20
[TOC] 什么是 property特性 property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻:低于18.5 正常:1 ......
目录
什么是 property特性
- property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用
例一:bmi指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
-
成人的bmi数值:
- 过轻:低于18.5
- 正常:18.5-23.9
- 过重:24-27
- 肥胖:28-32
- 非常肥胖,高于32
-
体质指数(bmi)= 体重(kg)÷ 身高^2(m)
- e.g:70kg÷(1.75×1.75)=22.86
class people: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height def bmi(self): return self.weight / (self.height**2) peo1 = people('nick', 70, 1.8)
print(peo1.bmi())
21.604938271604937
property特性单独使用
class people: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height @property def bmi(self): return self.weight / (self.height**2) peo1 = people('nick', 70, 1.8)
print(peo1.bmi)
21.604938271604937
peo1.height = 1.85 print(peo1.bmi)
20.45288531775018
property特性+类的封装
class people: def __init__(self, name): self.__name = name @property # 查看obj.name def name(self): return '<名字是:%s>' % self.__name peo1 = people('nick')
print(peo1.name)
<名字是:nick>
try: peo1.name = 'egon' except exception as e: print(e)
can't set attribute
setter/deleter装饰器
- 控制属性的修改和删除
class people: def __init__(self, name): self.__name = name @property # 查看 obj.name def name(self): return '<名字是:%s>' % self.__name @name.setter # 修改 obj.name=值 触发 def name(self, name): if type(name) is not str: raise typeerror('名字必须是str类型傻叉') self.__name = name @name.deleter # 删除 del obj.name 触发 def name(self): # raise permissionerror('不让删') print('不让删除傻叉') # del self.__name peo1 = people('nick')
print(peo1.name)
<名字是:nick>
try: peo1.name = 10 except exception as e: print(e)
名字必须是str类型傻叉
peo1.name = 'nick' print(peo1.name)
<名字是:nick>
del peo1.name
不让删除傻叉
property的古老用法(了解)
class people: def __init__(self, name): self.__name = name def tell_name(self): return '<名字是:%s>' % self.__name def set_name(self, name): if type(name) is not str: raise typeerror('名字必须是str类型傻叉') self.__name = name def del_name(self): print('不让删除傻叉') # 相当于添加了property、setter、deleter装饰器(推荐使用装饰器) # 与property()方法内的函数名字无关,三个函数必须依次为打印、修改、删除 name = property(tell_name, set_name, del_name) peo1 = people('egon')
print(peo1.name)
<名字是:egon>
peo1.name = 'egon' print(peo1.name)
<名字是:egon>
del peo1.name
不让删除傻叉
property特性练习
- 圆的周长和面积
import math class circle: def __init__(self, radius): # 圆的半径radius self.radius = radius @property def area(self): return math.pi * self.radius**2 # 计算面积 @property def perimeter(self): return 2 * math.pi * self.radius # 计算周长 c = circle(10)
print(c.radius)
10
print(c.area) # 可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
314.1592653589793
print(c.perimeter) # 同上
62.83185307179586