我正在尝试动态地将一个函数分配给一个类实例的__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']
如预期的那样,但不能为每个类的实例定制。有什么想法吗?
答案 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)