看起来dir()的默认工作方式是:
dir(obj) == sorted(obj.__dict__.keys() + dir(obj.__class__))
(嗯,无论如何要删除重复项)
因此,一种方法是:
class Wizard(object): def __init__(self): self.mana = 0 def __dir__(self): natdir = set(self.__dict__.keys() + dir(self.__class__)) if self.mana <= 0: natdir.remove("domagic") return list(natdir) def addmana(self): self.mana += 1 def domagic(self): if self.mana <= 0: raise NotEnoughMana() print "Abracadabra!" self.mana -= 1
在Py2.6中的行为是:
>>> wiz = Wizard()>>> [x for x in dir(wiz) if not x.startswith("_")]['addmana', 'mana']>>> wiz.addmana()>>> [x for x in dir(wiz) if not x.startswith("_")]['addmana', 'domagic', 'mana']>>> wiz.domagic()Abracadabra!>>> [x for x in dir(wiz) if not x.startswith("_")]['addmana', 'mana']>>> wiz.domagic()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 13, in domagic__main__.NotEnoughMana
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)