当前位置: 移动技术网 > IT编程>脚本编程>Python > 类的property特性

类的property特性

2019年06月09日  | 移动技术网IT编程  | 我要评论

我还活着配置,马后炮队长,撕裂人1

目录

什么是 property特性

  • property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用

96-类的property特性-bmi.jpg

例一: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装饰器

  • 控制属性的修改和删除

96-类的property特性-控制.jpg

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的古老用法(了解)

96-类的property特性-古老.jpg

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特性练习

  • 圆的周长和面积

96-类的property特性-周长和面积.jpg

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网