Python 3.x 如何在Python 3.1中的函数中使用_getattr__?
我试图在函数中重新定义\uuu getattr\uuu方法 我尝试过以下代码:Python 3.x 如何在Python 3.1中的函数中使用_getattr__?,python-3.x,Python 3.x,我试图在函数中重新定义\uuu getattr\uuu方法 我尝试过以下代码: def foo(): print("foo") def addMethod(obj, func): setattr(obj, func.__name__, types.MethodType(func, obj)) def __getattr__(obj, name): print(name) addMethod(foo, __getattr__) foo.bar 但我得到了这个错误:
def foo():
print("foo")
def addMethod(obj, func):
setattr(obj, func.__name__, types.MethodType(func, obj))
def __getattr__(obj, name):
print(name)
addMethod(foo, __getattr__)
foo.bar
但我得到了这个错误:
Traceback (most recent call last):
File blah blah, line 14, in <module>
foo.bar
AttributeError: 'function' object has no attribute 'bar'
回溯(最近一次呼叫最后一次):
文件等等,第14行,在
美食酒吧
AttributeError:“函数”对象没有属性“bar”
我已经检查了“foo”函数,它确实有绑定到它的方法,但是如果动态设置它,\uu getattr\uu将不会被调用。
如果我对一个类执行相同的操作,如果我使用我的“addMethod”函数设置\uuuuu getattr\uuu,那么实例也不会调用\uu getattr\uu!,所以问题一定是动态调用
但是如果我把\uu getattr\uu放在类的定义中,它显然会起作用
问题是,我如何将\uuu getattr\uuu放入函数以使其工作?我不能从头开始,因为它是一个函数!,我不知道怎么做
谢谢 嗯,你没有。如果需要属性,请创建一个类。如果希望实例是可调用的,请为其定义
\uuuu call\uuu
class foo:
def __call__(self):
print("foo")
def __getattr__(self, name):
print(name)
f = foo()
f() # foo
f.bar # bar
您的问题是,Python只会在对象类上查找
\uuuuxxx\uuuuuu
魔术方法,而不是对象本身。因此,即使您在foo
的实例上设置\uuu getattr\uuu
,它也永远不会被自动调用
这也是您在使用class foo
时遇到的问题:
class foo():
pass
def addMethod(obj, func):
setattr(obj, func.__name__, func)
def __getattr__(obj, name):
print(name)
addMethod(foo, __getattr__)
foo.bar
这里Python正在查找类对象foo上的bar
,这意味着
您添加到foo
中的\uuuu getattr\uuuu
方法不是被调用,而是Python正在查看foo
的元类,即type
如果你把最后一行改成
foo().bar
并获得一个foo类的实例,它将起作用。从未使用过“call”方法,我认为这将对我有很大帮助,但我必须尝试。谢谢你的回答。