在飞行中重命名方法

时间:2016-05-03 10:55:12

标签: python variables dynamic methods rename

我们可以使用元类在类定义时重命名类方法。这个问题

这更像是一个思想实验,所以请你多一点幽默。

说我想编写两个这样使用的装饰器:

class SomeClass(object):

    @append_A
    def some_method( self ):
        pass

    @append_B
    def some_method( self ):
        pass

哪会导致SomeClass有两种方法:some_method_Asome_method_B

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

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

1 个答案:

答案 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()