动态地将函数分配给实例的__dir__

时间:2010-11-04 03:16:48

标签: python

我正在尝试动态地将一个函数分配给一个类实例的__del__,以便在该对象上使用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 个答案:

答案 0 :(得分:1)

好的,根据你的评论我做了一些事情。我认为这可能更接近你正在寻找的行为。调用没有args的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)
相关问题