[英]Python @property.setter
创建装饰器的基本方法是
def my_decorator(f):
def _f(*args, **kwargs):
# do something using f
pass
return _f
@my_decorator
def f(...):
...
但是那样一来,您就无法定义@property.setter
类的装饰器,因为@property.setter
的名称(以及装饰器的名称)每次都不同。
那么@property.setter
是如何定义的? 是否可以在Python中做类似的事情,还是仅在C(实现)级别提供了内置功能?
您正在寻找的是称为描述符的东西:
class Descriptor(object):
def __get__(self, instance, _type=None):
pass
def __set__(self, obj, value):
pass
您可以自由地执行自己认为合适的事情。 property
装饰器只是一个描述符的实例(或多或少),您可以在描述该项目的文档中看到它们的实现方式。
这是一个例子:
class _Wrapper(object):
def __init__(self, caller, instance):
self.caller = caller
self.instance = instance
def __call__(self, *args, **kwargs):
print "I've been wrapped!"
return self.caller(self.instance, *args, **kwargs)
class Accouncer(object):
def __init__(self, method):
self.method = method
def __get__(self, instance, _type=None):
return _Wrapper(self.method, instance)
def vocal(func):
return Accouncer(func)
class Ha(object):
@vocal
def stuff(self):
return 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.