创建可管理对象属性, 类的property

from math import pi
class Circle(object):
    def __init__(self,radius):
        self.radius = radius
    
    def getRadius(self):
        return self.radius
    
    def setRadius(self, value): 
        if not isinstance(value, (int, float)):   #自定义类型  此处可以一个类型,或者由元组包含多个类型, 如果不满足条件,raise ValueError错误  
             raise ValueError('wrong type.')
        self.radius = float(value)
    def getarea(self):
            return self.radius * 2 * pi
c= Circle(3.2)
c.setRadius("abc")
print(c.setRadius)

property用法

from math import pi
class Circle(object):
    def __init__(self,radius):
        self.radius = radius
    
    def getRadius(self):
        return self.radius
    
    def setRadius(self, value):
        if not isinstance(value, (int, float)):
             raise ValueError('wrong type.')
        self.radius = float(value)
    def getArea(self):
        return self.radius ** 2 * pi

    R = property(getRadius, setRadius)
c = Circle(3.2)
print(c.R)
#c.R= 'abc'
#print(c.R)
c.R = 34
print('nihasdf',c.R)

特性(property)
什么是特性property
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
成人的BMI数值:过轻:低于18.5 正常:18.5-23.9 过重:24-27 肥胖:28-32 非常肥胖, 高于32
体质指数(BMI)=体重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75)=22.86

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

    @property
    def bmi(self):
        print('=====>>')
        return self.weight / (self.height ** 2)

p = People('egon',50,1.65)
p.bmi1 = p.weight / (p.height ** 2)
print('0001',p.bmi1)

print(p.bmi())  # 报错  TypeError: 'float' object is not callable
p.height = 1.85
print(p.bmi)
# p.bmi = 25      #报错  AttributeError: can't set attribute
class People:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):
        print('getter')
        return self.__name

    @name.setter  #   修改
    def name(self,val):
        print('setter',val)
        if not isinstance(val,str):
            print('名字必须是字符串类型')
            return
        self.__name = val

    @name.deleter  # 删除
    def name(self):
        print('deleter')
        print('不允许删除')

p = People('egon')
print(p.name)
p.name = 'alex'
print(p.name)
p.name =1223
print(p.name)
del p.name
输出:
getter
egon
setter alex
getter
alex
setter 1223
名字必须是字符串类型
getter
alex
deleter
不允许删除
posted @ 2021-05-19 15:29  ty1539  阅读(49)  评论(0编辑  收藏  举报