2010-11-04 38 views
1

我想动态地分配一个函数__del__的一个类的实例,以便它在该对象上使用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'] 

如预期的那样,但不能为每个i定制班级的真实性。有任何想法吗?

回答

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) 
+0

这将在正常情况下工作。不过,我的情况有点奇怪,因为我实际上需要在'__init__'期间调用dir(),并且当时我需要得到正常的dir()输出(没有自己定义的__dir__')。在那次调用之后,我想定义我的'__dir__'方法。 – Tommy 2010-11-04 03:35:40

+0

dir(self .__ class__)就是答案!我没有想过这样做。我甚至不需要在实例属性中存储任何东西。 – Tommy 2010-11-04 04:21:17

+0

我必须这样做的原因是因为我已经重写了'__getattr__',因此,当访问实例的属性并且该属性不存在时,将为该属性自动创建预定类型的对象。 – Tommy 2010-11-04 04:22:23