欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

类的property特性

程序员文章站 2022-07-11 16:14:20
[TOC] 什么是 property特性 property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻:低于18.5 正常:1 ......

目录

什么是 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装饰器

  • 控制属性的修改和删除

类的property特性

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

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

  • 圆的周长和面积

类的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