def a():
print 'sss'
print getattr(a, "_decorated_function", a).__name__
打印:
a
感谢
更新
我的代码:
def a():
w='www'
print getattr(a,'w')
但打印出来:
Traceback (most recent call last):
File "D:\zjm_code\a.py", line 8, in <module>
print getattr(a,'w')
AttributeError: 'function' object has no attribute 'w'
答案 0 :(得分:4)
请参阅documentation for getattr in Python。它打印“a”的原因是因为“a”没有名为“_decorated_function”的属性,而getattr()的第三个参数是在第一个参数没有名称为的属性时返回的默认值第二个参数。所以,你的代码与:
相同print a.__name__
毫不奇怪,一个人的名字是“a”,因此你可以得到它作为输出。顺便说一句,我强烈建议您在StackOverflow上发布问题之前搜索Python文档,因为您更有可能在那里得到答案。您可能还会发现我的Development and Coding Search自定义搜索引擎可用于查找相关的Python参考文档以供将来查询。
答案 1 :(得分:1)
如果a
有一个名为_decorated_function
的属性,则返回该属性包含的内容,否则返回a
。说真的,这都是in the docs。
答案 2 :(得分:1)
回应更新问题
声明后必须为函数赋予其属性。
def a():
pass
a.w = 'www'
print a.w
与其他OO语言更相似的另一种方法是使用类。这个例子将创建一个静态属性:
class a:
w = 'www'
print a.w
这将使得在类a的所有实例之间共享w,这在程序中作为常量最有用。如果您在另一个上将使用变量并更改其值,则最好执行以下操作:
class b:
def __init__(self):
self.w = 'www'
c = b()
print c.w
答案 3 :(得分:0)
我会猜测:
代码可以分为两个步骤:
func = getattr(a, "_decorated_function", a)
print func.__name__
忽略第一行。
第二行打印func
的名称,在您的情况下恰好是'a'
。毫不奇怪。
第一行就是装饰器的情况:
class My_decorator:
def __init__(self,func):
self._decorated_function = func
def __call__(self,arg):
self._decorated_function(arg+1)
@My_decorator
def a(i):
print i
print a(0)
>>> 1
print a._decorated_function.__name__
>>> a
因此,您将要调用的对象getattr(a, "_decorated_function", a)
应该是函数或具有“装饰”函数的类。