类的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特性的主要内容,如果未能解决你的问题,请参考以下文章

Python-类的特性(property)

Python的特性(property) (转)

Python的特性(Property)和描述符

封装与特性(property)

特性(property)

Property、attributey、field有啥区别?