动态分配函数到实例的__dir__
我想给一个类的实例动态地指定一个函数,这样在对这个对象使用 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)