类的property特性
Posted nickchen121
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的property特性相关的知识,希望对你有一定的参考价值。
什么是 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
以上是关于类的property特性的主要内容,如果未能解决你的问题,请参考以下文章