5

私は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()は誤解を招くように思われます。

4

6 に答える 6

8

「」の代わりに、「print hasattr(d1,each)」を試してくださいprint each, type(getattr(d1,each))。結果は参考になるはずです。

また、あなたが本当に探していると思うdir()tryの代わりに。help()

于 2009-05-18T23:16:17.697 に答える
4

標準ライブラリのinspectモジュールの使用を検討してください。これは、多くの場合、イントロスペクションへの最も便利なアプローチであり、機能のかなりの部分をパッケージ化します(最初から実装することもできますが、十分にテストされ、適切に設計されたコードを再利用することは良いことです)。詳細については、 http://docs.python.org/library/inspect.htmlを参照してください。ただし、たとえばinspect.getmembers(foo, inspect.ismethod)、fooのすべてのメソッドを取得するための優れた方法です((name, value)名前でソートされたペアを取得します)。

于 2009-05-19T04:25:07.587 に答える
2

これは、厳密に言えば、すべてのメソッドが属性であることを示しています。しかし、()なしでメソッドを呼び出すことはできないので、hasattr()は誤解を招くように思われます。

なぜ誤解を招くのですか?obj.ban()がメソッドの場合、obj.banは対応する属性です。次のようなコードを作成できます。

print obj.getValue()

また

get = obj.getValue
print get()

オブジェクトのメソッドのリストを取得したい場合は、この関数を試すことができます。メソッドではない呼び出し可能な属性もトリガーされるため、完全ではありませんが、99%の場合は十分に適切であるはずです。

def methods(obj):
    attrs = (getattr(obj, n) for n in dir(obj))
    return [a for a in attrs if a.hasattr("__call__")]
于 2009-05-18T23:07:30.070 に答える
2

infoDive into Pythonから着想を得たこのモジュールは、目的を果たします。

def info(obj, spacing=20, collapse=1, variables=False):
    '''Print methods and their doc Strings

    Takes any object'''
    if variables:
    methodList = [method for method in dir(obj)]
    else:
    methodList = [method for method in dir(obj) if callable(getattr(obj,method))]

    #print methodList


    print '\n'.join(['%s %s' %
            (method.ljust(spacing),
             " ".join(str(getattr(obj,method).__doc__).split()))
            for method in methodList])


if __name__=='__main__':
    info(list)
于 2009-05-19T18:40:25.170 に答える
1

理想的には、BeautifulSoupのような複雑なライブラリを使用する場合は、そのドキュメントを参照して、各クラスが提供するメソッドを確認する必要があります。ただし、簡単にアクセスできるドキュメントがないまれなケースでは、次の方法を使用してメソッドの存在を確認できます。

それ自体がオブジェクトであるすべてのメソッドはメソッドを実装し、チェックされる値にメソッドがある場合に__call__を返すcallable()メソッドを使用してチェックできます。True__call__

次のコードが機能するはずです。

x = Die()
x.roll()

for attribute in dir(x) :
    print attribute, callable(getattr(x, attribute))

上記のコードは、すべてのメソッドに対してtrueを返し、呼び出し不可能なすべての属性(banなどのデータメンバーなど)に対してfalseを返します。ただし、このメソッドはTrue、呼び出し可能なオブジェクト(内部クラスなど)に対しても戻ります。属性のタイプがであるかどうかを確認することもできますinstancemethod

于 2009-05-18T23:08:30.223 に答える
1

呼び出し可能と呼ばれる組み込みメソッドがあります。これは任意のオブジェクトに適用でき、呼び出すことができるかどうかに応じてTrue/Falseを返します。例えば

>>> def foo():
...   print "This is the only function now"
...
>>> localDictionary = dir()
>>> for item in localDictionary:
...   print repr(item) + "is callable: " + str(callable(locals()[item]))
'__builtins__'is callable: False
'__doc__'is callable: False
'__name__'is callable: False
'foo'is callable: True

locals()呼び出しは、現在のスコープで定義されているすべてを含むディクショナリを返すことに注意してください。これを行ったのは、ディクショナリの項目が単なる文字列であり、実際のオブジェクトに対してcallableを実行する必要があるためです。

于 2009-05-18T23:09:17.260 に答える