我们可以使用元类在类定义时重命名类方法。这个问题不。
这更像是一个思想实验,所以请你多一点幽默。
说我想编写两个这样使用的装饰器:
class SomeClass(object):
@append_A
def some_method( self ):
pass
@append_B
def some_method( self ):
pass
哪会导致SomeClass
有两种方法:some_method_A
和some_method_B
这可能吗?如果可以的话,你能指出我正确的方向吗?
我尝试过几种不同的方式更改框架f_locals
,但方法名称仍然存在。
答案 0 :(得分:3)
不,不能使用装饰器更改方法名称,如documentation中所述:
装饰器语法只是语法糖,以下两个函数定义在语义上是等价的:
def f(...):
...
f = staticmethod(f)
@staticmethod
def f(...):
...
更多语法讨论here。
我想我们可以做一些事情,比如在装饰器中单独保留方法,但是在定义的范围内添加一个带有编辑过的名称的新方法(本例中是类)。主要的是定义两个具有相同名称的方法,然后以两个不同命名的方法结束,这些方法被传递给元类。
为此,您可以使用类装饰器:
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()