在定义python类时从方法访问它

在定义python类时从方法访问它,python,methods,reflection,Python,Methods,Reflection,我想访问要在其上定义方法的类。例如,可以使用它为具有decorator的方法创建别名。这种特殊情况可以在不使用decorator的情况下实现(alias=original_name),但我希望使用decorator,主要是因为别名将沿着顶部的方法定义可见,在方法定义较长时非常有用 def method_alias(*aliases): def aliased(m): class_of_m = ??? # GET class of this method f

我想访问要在其上定义方法的类。例如,可以使用它为具有decorator的方法创建别名。这种特殊情况可以在不使用decorator的情况下实现(
alias=original_name
),但我希望使用decorator,主要是因为别名将沿着顶部的方法定义可见,在方法定义较长时非常有用

def method_alias(*aliases):
    def aliased(m):
        class_of_m = ??? # GET class of this method
        for alias in aliases:
            setattr(class_of_m, alias, m)
        return m
    return aliased

class Test():
    @method_alias('check', 'examine')
    def test():
        print('I am implemented with name "test"')

后来,我发现可以通过使用两个decorator实现上述功能(首先将别名存储为方法属性,然后在已经创建类时,将属性添加到类中)。它可以不修饰类就完成吗,即只修饰方法?这需要访问装饰器中的类名。

简短的回答是否。在创建类对象之前,会评估类主体的内容,即创建函数
test
,并将其传递给装饰器,而不存在类
test
。因此,装饰程序无法获取对它的引用

为了解决方法别名问题,我认为有三种方法:

  • 使用链接中描述的类装饰器
  • 使用元类,可以在创建类对象之前修改类“
    \uuuu dict\uuuu
    。(实现元类类实际上覆盖了类对象的默认构造函数,请参见。此外,Python 3中的元类用法语法也发生了更改。)
  • 测试
    的每个实例在
    初始化
    方法中创建别名
第一种方法可能是最直接的。我写了另一个例子。它基本上和你的链接一样,但是为了让它更清晰,它更精简了

def alias(*aliases):
    def decorator(f):
        f.aliases = set(aliases)
        return f
    return decorator

def apply_aliases(cls):
    for name, elem in list(cls.__dict__.items()):
        if not hasattr(elem, 'aliases'):
            continue
        for alias in elem.aliases:
            setattr(cls, alias, elem)
    return cls

@apply_aliases
class Test(object):
    @alias('check', 'examine')
    def test(self):
        print('I am implemented with name "test"')

Test().test()
Test().check()
Test().examine()