我们可以在类定义时使用元类重命名类方法。这个问题是not关于那个。
这更像是一个思想实验,所以请稍微幽默一下。
假设我想编写两个这样使用的装饰器:
class SomeClass(object):
@append_A
def some_method( self ):
pass
@append_B
def some_method( self ):
pass
这会导致SomeClass
有两种方法:some_method_A
and some_method_B
这可能吗?如果可以,你能给我指出正确的方向吗?
我尝试过改变框架f_locals
几种不同的方法,但方法名称仍然存在。
不,不可能使用装饰器更改方法名称,如中所述文档:
装饰器语法仅仅是句法糖,以下两个函数定义在语义上是等效的:
def f(...):
...
f = staticmethod(f)
@staticmethod
def f(...):
...
更多语法讨论继续here.
Update
我想我们可以做一些事情,比如将方法单独保留在装饰器中,但也可以在定义的范围内添加一个具有编辑名称的新方法(在本例中是类)。主要的事情是定义两个具有相同名称的方法,然后以两个不同名称的方法结束,并将其传递给元类。
为此,您可以使用类装饰器:
def append_B(func):
func.suffix='_B'
return func
def appendable(class_obj):
for name in dir(class_obj):
if not name.startswith('_'):
attr = class_obj.__dict__[name] #getattr(class_obj, name)
suffix = getattr(attr, 'suffix', None)
if isinstance(suffix,str):
attr.suffix = None
setattr(class_obj,name+suffix, getattr(class_obj, name))
#delattr(class_obj,name)
return class_obj
以下用法允许您为同一方法定义两个名称:
@appendable
class B(object):
@append_B
def some_method(s):
print 'B.some_method'
b=B()
b.some_method()
b.some_method_B()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)