我正在努力学习用Python编写程序,并致力于更好地掌握如何使用标准模块和其他模块。dir函数在解释器中似乎非常强大,但是我想知道我是否因为缺乏OOP背景而遗漏了一些东西。使用S.Lotts的书,我决定使用他的Die类来学习更多关于语法以及类和实例的使用的知识。在
以下是原始代码:
class Die(object):
''' simulate a six-sided die '''
def roll(self):
self.value=random.randrange(1,7)
return self.value
def getValue(self):
return self.value
我正在研究这个问题,在创建了一些实例之后,我想知道单词value是否是一个关键字,以及object在class语句中的用法是什么,因此我决定通过将类定义更改为以下内容来找出答案:
^{pr2}$这一变化表明,我从实例中获得了相同的行为,但在执行dir操作时,实例中缺少以下方法/属性:
'__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
_repr__', '__setattr__', '__str__', '__weakref__'
我还发现,当我对一个实例执行dir时,我有一个额外的关键字-ban,我最终发现这是我的实例的一个属性。这帮助我理解了可以使用d1.ban访问实例的值。我能确定这是一个属性的唯一原因是我输入了d1.happy并得到了一个AttributeError我发现d1.GetValue是一个附加到Die的方法,因为这是解释程序告诉我的。在
所以,当我试图使用一些复杂但有用的模块时,比如beauthoulsoup,我如何知道在输入dir(instance)之后,列出的是我实例的属性还是实例的方法。我需要知道这一点,因为这一点让我明白,对于属性,我调用的是方法的结果,而对于方法,我调用的是实例上的函数。在
这个问题可能过于冗长,但它确实帮助我更好地理解属性和方法之间的区别。具体地说,当我查看在Die类的一个实例上调用dir的结果时,我看到了这一点
['__doc__', '__module__', 'ban', 'getValue', 'roll']
因此,通过查看列表来了解哪些是属性,哪些是方法,而不必求助于反复尝试或结果输入hasattr(myInstance,suspectedAttributeName)。在
把问题贴出来后我试过了
for each in dir(d1):
print hasattr(d1,each)
严格地说,所有方法都是属性。但是我不能在没有()的情况下调用方法,因此在我看来hasattr()是误导性的。在
为什么有误导性?如果
obj.ban()
是一个方法,那么obj.ban
就是相应的属性。你可以有这样的代码:或者
^{pr2}$如果你想得到一个对象的方法列表,你可以试试这个函数。这并不完美,因为它也会触发非方法的可调用属性,但对于99%的情况,应该足够好:
代替:“
print hasattr(d1,each)
”,请尝试:“print each, type(getattr(d1,each))
”。你应该会发现结果信息丰富。在另外,用
dir()
代替help()
,我想你真的在找这个。在考虑使用标准库的
inspect
模块——它通常是最方便的内省方法,打包大量的功能块(您可以从头开始实现,但重用经过良好测试、设计良好的代码是一件好事)。有关所有详细信息,请参见http://docs.python.org/library/inspect.html,但例如,inspect.getmembers(foo, inspect.ismethod)
是获取foo所有方法的极好方法(您将得到按名称排序的(name, value)
对)。在相关问题 更多 >
编程相关推荐