动态分配函数到实例的__dir__

1 投票
1 回答
825 浏览
提问于 2025-04-16 06:32

我想给一个类的实例动态地指定一个函数,这样在对这个对象使用 dir() 时就会调用这个函数。我需要每个类的实例都有独特的 __dir__ 方法。作为一个简化的例子,我试过:

import types
class Foo(object):
    def __init__(self, arg):
        def __dir__(self):
            print "in __dir__"
            return [arg]
        self.__dir__ = types.MethodType(__dir__, self, self.__class__)

foo = Foo('bar')
print dir(foo)
print
print foo.__dir__()

这段代码打印出:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

in __dir__
['bar']

如果我改成这样:

class Foo(object):
    def __dir__(self):
        print "in __dir__"
        return ['bar']

foo = Foo()
print dir(foo)

那输出结果是:

in __dir__
['bar']

这正是我预期的,但无法为每个类的实例进行定制。有没有什么好主意?

1 个回答

1

好的,根据你的评论,我稍微调整了一下。我觉得这样可能更接近你想要的效果。调用不带参数的 dir 会列出当前作用域内的所有名称,而在 __class__ 上调用它会列出所有的类名。这种方式不考虑已经定义的 __dir__,但你可以稍后再调用它。我很好奇你是用这个做什么,也许有更简单的方法可以达到你想要的效果?

class Foo(object):
    def __init__(self, arg=None):
        self.arg = arg
        print dir(self.__class__) + dir()

    def __dir__(self):
        return [self.arg()]


def dirfoo():
    return ["new thing"]

foo = Foo(dirfoo)

print dir(foo)

撰写回答