私はPythonでのプログラミングの学習に取り組んでおり、Standardやその他のモジュールの使用方法をよりよく理解することに重点を置いています。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
私はそれを見て、いくつかのインスタンスを作成した後、単語の値が何らかの形でキーワードであるかどうか、クラスステートメントでの単語オブジェクトの使用は何をするのか疑問に思ったので、クラス定義を次のように変更して調べることにしました。
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__'
また、インスタンスでdirを実行したときに、追加のキーワード禁止があり、それがインスタンスの属性であることが最終的にわかったことがわかりました。これは、 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()は誤解を招くように思われます。