如何创建可管理的对象属性?

需求:
在面向对象的编程中,我们把方法(函数)看作对象的接口,直接访问对象的属性可能是不安全的,或设计上不够灵活。但是使用调用方法在形式上不如访问属性简洁。
circle.getRadius()
circle.setRadius(5.0) # 繁

circle.radius
circle.radius = 5.0 # 简

能否在形式上是属性的访问,但是实际调用方法?

思路:
使用property函数为类创建可管理属性,fget/fset/fdel对相应属性访问

代码:

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.R的时候调用的方法,第二个参数为c.R=xxx时调用的方法

c = Circle(3.2)
print(c.R)
c.R = 'abc'
print(c.R)

==================================================================

import math
class Circle:
    def __init__(self,radius):
        self.radius = radius

    def get_radius(self):
        return round(self.radius,2)

    def set_radius(self,radius):
        if not isinstance(radius,(int,float)):
            raise TypeEror('woring type')
        self.radius = radius

    @property
    def S(self):
        return self.radius ** 2 * math.pi

    @S.setter
    def S(self,s):
        self.radius = math.sqrt(s / math.pi)

    R = property(get_radius,set_radius)

c = Circle(5.712)
c.S = 99.88
print(c.S)
print(c.R)

#c.R = 100.987
#print(c.R * 2)
# c.radius = '31.98'
#c.set_radius('31.38')
#d = c.radius * 2
#print(c.get_radius())

posted @ 2020-07-22 22:04  Richardo-M-Lu  阅读(99)  评论(0编辑  收藏  举报