class MyProperty:
def init(self, fget=None, fset=None, fdel=None):
self.fget = fget # getter 方法
self.fset = fset # setter 方法
self.fdel = fdel # deleter 方法
def get(self, instance, owner):
if instance is None:
return self
if self.fget is None:
raise AttributeError("不可读")
return self.fget(instance)
def set(self, instance, value):
if self.fset is None:
raise AttributeError("不可写")
self.fset(instance, value)
def delete(self, instance):
if self.fdel is None:
raise AttributeError("不可删除")
self.fdel(instance)
def setter(self, func):
self.fset = func
return self # 返回自己,支持链式调用
class User:
def init(self, name):
self._name = name
@MyProperty # 等价于 name = MyProperty(name)
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
u = User("张三")
print(u.name) # 调用 get
u.name = "李四" # 调用 set
print(u.name) # 李四