作用

  静态属性就是将类中方法封装,在python中利用@property语句实现。

  @property的作用实际上非常强大。它可以允许将某一方法不用加括号就直接调用,看起来就跟访问属性一样,也可以控制对某一属性的增删改查之类的操作。它有一个别称叫做“数据描述符” 。

  Ps:@property最最单纯的用法应该是与封装相关..属于面向对象封装里的一个特性。其实在写分页插件的时候,我就实际用到过@property这个方法,它其实就是一个数据描述符类。 关于具体的内部实现原理这里不太方便做介绍,会在后面讲描述符的时候专门提出来分析。

print(property)  # <class 'property'>

伪装方法为属性的案例

  BMI指数是用来衡量一个人的体重与身高对健康影响的一个指标,计算公式为:

  体质指数(BMI)=体重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75)=22.86

  身高或体重是不断变化的,因而每次想查看BMI值都需要通过计算才能得到,但很明显BMI听起来更像是一个特征而非功能,为此Python专门提供了一个装饰器@property可以将类中的函数“伪装成”对象的数据属性(实例属性),对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果,例如:

class People:

    def __init__(self,name,weight,height):
        self.name = name
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        """BMI在18.bai5至24.9时属正常范围,BMI大于25为超重du,BMI大于30为肥胖。zhi"""
        return self.weight / (self.height**2)

obj=People('lili',75,1.85)
print(obj.bmi) # 21.913805697589478

# 看起来是在调用实例属性,实际上是拿到的实例绑定方法处理完毕后的结果。

控制属性的增删改查案例

class Foo:

    def __init__(self,name):
        self.__name = name

    @property  # 当用户访问 obj.name 发生的事...
    def name(self):
        return "你的偶像:[{0}],永远滴神...".format(self.__name)  # 可以看到返回的是 __name

    @name.setter  # 当用户设置 obj.name 发生的事儿...
    def name(self,value):
        val = "UZI"
        if value != val or value != "UZI":
            print("乌兹!永远的神!不允许修改其他值!")
        else:
            self.__name = val

    @name.deleter  # 当用户删除 obj.name 发生的事儿...
    def name(self):
        print("不允许删除!")

f1 = Foo("乌兹")   # 开始设置,相当于增..触发 @name.setter 下的函数运行
print(f1.name)    # 访问时候触发 @property 下的函数运行
f1.name = "UZI"   # 修改设置.. 触发 @name.setter 下的函数运行
print(f1.name)    # 访问时候触发 @property 下的函数运行
f1.name = "bang"  # 设置的是bang,不会成功,触发 @name.setter 下的函数运行
del f1.name  # 删除时候触发 @name.deleter 下的函数运行

# ==== 执行结果 ====

"""
你的偶像:[乌兹],永远滴神...
你的偶像:[UZI],永远滴神...
乌兹!永远的神!不允许修改其他值!
不允许删除!
"""
property实例化实现控制属性增删改查方式一

相关文章: