Gri*_*fin 2 python variables methods rename dynamic
我们可以在类定义时使用元类重命名类方法。这个问题不是关于那个。
这更像是一个思想实验,所以请幽默一点。
假设我想编写两个像这样使用的装饰器:
class SomeClass(object):
@append_A
def some_method( self ):
pass
@append_B
def some_method( self ):
pass
Run Code Online (Sandbox Code Playgroud)
这将导致SomeClass有两种方法:some_method_A和some_method_B
这是可能的,如果是,你能指出我正确的方向吗?
我尝试f_locals通过几种不同的方式更改框架,但方法名称仍然存在。
不,不能使用装饰器更改方法名称,如文档中所述:
装饰器语法只是语法糖,以下两个函数定义在语义上是等效的:
def f(...):
...
f = staticmethod(f)
@staticmethod
def f(...):
...
Run Code Online (Sandbox Code Playgroud)
更多语法讨论在这里。
我想我们可以做一些事情,比如将方法单独留在装饰器中,但也可以在定义的范围内添加一个具有编辑名称的新方法(在这种情况下是类)。主要的事情是定义两个具有相同名称的方法,然后以两个不同名称的方法结束,这些方法传递给元类。
为此,您可以使用类装饰器:
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
Run Code Online (Sandbox Code Playgroud)
以下用法允许您为同一方法定义两个名称:
@appendable
class B(object):
@append_B
def some_method(s):
print 'B.some_method'
b=B()
b.some_method()
b.some_method_B()
Run Code Online (Sandbox Code Playgroud)