当你查看dir中列出的属性和方法列表时,你怎么知道哪些是属性,哪些是方法?

2024-04-26 20:54:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习用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()是误导性的。在


Tags: 模块实例方法函数self属性objectvalue
3条回答

which tells me strictly speaking that all methods are attributes. but I can't call a method without the () so it seems to me that the hasattr() is misleading.

为什么有误导性?如果obj.ban()是一个方法,那么obj.ban就是相应的属性。你可以有这样的代码:

print obj.getValue()

或者

^{pr2}$

如果你想得到一个对象的方法列表,你可以试试这个函数。这并不完美,因为它也会触发非方法的可调用属性,但对于99%的情况,应该足够好:

def methods(obj):
    attrs = (getattr(obj, n) for n in dir(obj))
    return [a for a in attrs if a.hasattr("__call__")]

代替:“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)对)。在

相关问题 更多 >