我正在努力学习用 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 是否是关键字,以及 class 语句中单词 object 的用途是什么,因此我决定通过将类定义更改为以下内容来找出答案:
class Die():
''' simulate a six-sided die '''
def roll(self):
self.ban=random.randrange(1,7)
return self.ban
def getValue(self):
return self.ban
这种变化表明我从我的实例中得到了相同的行为,但是当我执行 dir 时,实例中缺少以下方法/属性:
'__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
_repr__', '__setattr__', '__str__', '__weakref__'
我还发现当我在一个实例上做一个目录时,我有一个额外的关键字ban,我最终发现它是我实例的一个属性。这帮助我了解我可以使用d1.ban来访问我的实例的值。我能弄清楚这是一个属性的唯一原因是我输入了d1.happy并得到了一个AttributeError 我发现d1.GetValue是一个附加到 Die 的方法,因为这是解释器告诉我的。
因此,当我尝试使用诸如 BeautifulSoup 之类的复杂但有用的模块时,在键入dir(instance)后,我如何知道列出的哪些内容是我的实例的属性或我的实例的方法。我需要知道这一点,因为这种探索告诉我,我使用属性调用方法的结果,使用方法调用实例上的函数。
这个问题可能太罗嗦了,但它确实帮助我更好地理解了属性和方法之间的区别。具体来说,当我查看在 Die 类的实例上调用 dir 的结果时,我看到了这个
['__doc__', '__module__', 'ban', 'getValue', 'roll']
因此,通过查看该列表来了解哪些是属性和哪些是方法似乎很有用,而不必诉诸试验和错误或导致输入hasattr(myInstance,suspectedAttributeName)。
发布问题后,我尝试了
for each in dir(d1):
print hasattr(d1,each)
严格来说,它告诉我所有方法都是属性。但我不能调用没有()的方法,所以在我看来 hasattr() 具有误导性。