2010-11-04 40 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