属性であり、どのメソッドであるかを監督にリストした属性とメソッドのリストを見るとき、どのようにして知ることができますか?

StackOverflow https://stackoverflow.com/questions/880160

質問

私はPythonでプログラムすることを学ぼうとしていますが、標準モジュールやその他のモジュールの使用方法をより適切に処理することに集中しています。 dir関数は通訳で本当に強力に見えますが、OOPの背景がないために何かが欠けているのではないかと思います。 S.Lottsの本を使用して、彼のダイクラスを使用して、構文とクラスとインスタンスの使用について詳しく学ぶことにしました。

これが元のコードです:

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

その変化は、私が自分のインスタンスから同じ動作を得たことを私に示しましたが、私が監督をしたとき、次の方法/属性がインスタンスから欠落していました:

'__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
_repr__', '__setattr__', '__str__', '__weakref__'

また、インスタンスでdirを作成したとき、追加のキーワードがあることもわかりました。禁止 私がついに理解したのは、私のインスタンスの属性でした。これは、私が使用できることを理解するのに役立ちました D1.BAN 私のインスタンスの値にアクセスします。これが属性であることを理解できる唯一の理由は、私が入力したことでした d1.happy そして、 属性エラー 私はそれを理解しました d1.getValue それが通訳が私に言ったことだからです。

したがって、beautifulsoupのような複雑であるが役立つモジュールを使用しようとしているとき、タイピング後にリストされているものが私のインスタンスまたはインスタンスの方法の属性であるかを知るにはどうすればよいですか dir(インスタンス). 。これは、この突き刺しが属性を持ってメソッドの結果を呼び出しており、メソッドが私のインスタンスで機能を呼び出していることを教えてくれたので、これを知る必要があります。

この質問はおそらくあまりにも言葉がありますが、属性と方法の違いをよりよく理解するのに役立ちました。具体的には、ダイのクラスのインスタンスでDIRを呼び出した結果を見ると、これが見えます

['__doc__', '__module__', 'ban', 'getValue', 'roll']

そのため、試行錯誤またはタイピングに結果に頼らずに属性であり、どのメソッドであるかを見ることで知ることは有用であると思われます。 hasattr(myinstance、sundectedattributename).

質問を投稿した後、私は試しました

for each in dir(d1):
    print hasattr(d1,each)

これは、すべての方法が属性であることを厳密に言っていることを示しています。しかし、私はそれなしでは方法を呼ぶことはできません () ですから、Hasattr()は誤解を招くように思えます。

役に立ちましたか?

解決

それ以外の: "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) 名前でソートされたペア)。

これは、すべての方法が属性であることを厳密に言っていることを示しています。しかし、私は()なしでは方法を呼び出すことができないので、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__")]

これ info Dive 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)

Callableと呼ばれる組み込みの方法があります。任意のオブジェクトに適用すると、呼び出されるかどうかに応じて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()コールは、現在の範囲で定義されているすべてを含む辞書を返します。辞書からのアイテムが文字列にすぎないため、実際のオブジェクトで呼び出すことができるため、これを行いました。

理想的には、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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top