Python 3.x 如何在Python 3.1中的函数中使用_getattr__?

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 但我得到了这个错误:

我试图在函数中重新定义\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
但我得到了这个错误:

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”方法,我认为这将对我有很大帮助,但我必须尝试。谢谢你的回答。