python类与对象-如何创建可管理的对象属性
如何创建可管理的对象属性
问题举例
在面向对象编程中, 我们把方法看作对象的接口,
直接访问对象的属性可能是不安全的,或设计上不够灵活。
但是使用调用方法在形式上不如访问属性简洁。
circle.get_radius()
circle.set_radius(5.0) #繁琐
circle.radius
circle.radius = 5.0 #简洁
能否在形式上是属性访问,但实际上是内部调用方法?
解决思路
使用property函数为类创建可管理属性,fget/fset/fdel对应相应属性访问。
代码
import math class Circle: def __init__(self, radius): self.radius = radius def get_radius(self): return round(self.radius, 1) def set_radius(self, radius): if not isinstance(radius, (int, float)): raise TypeError('wronge 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) #print(c.get_radius()) #c.radius = '31.98
参考资料:python3实用编程技巧进阶