在定义python类时从方法访问它
我想访问要在其上定义方法的类。例如,可以使用它为具有decorator的方法创建别名。这种特殊情况可以在不使用decorator的情况下实现(在定义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
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
。因此,装饰程序无法获取对它的引用
为了解决方法别名问题,我认为有三种方法:
- 使用链接中描述的类装饰器
- 使用元类,可以在创建类对象之前修改类“
。(实现元类类实际上覆盖了类对象的默认构造函数,请参见。此外,Python 3中的元类用法语法也发生了更改。)\uuuu dict\uuuu
- 为
的每个实例在测试
方法中创建别名初始化
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()