动态重命名方法

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_Asome_method_B

这是可能的,如果是,你能指出我正确的方向吗?

我尝试f_locals通过几种不同的方式更改框架,但方法名称仍然存在。

gdl*_*lmx 5

不,不能使用装饰器更改方法名称,如文档中所述:

装饰器语法只是语法糖,以下两个函数定义在语义上是等效的:

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)