4

hasattr documentation は、オブジェクトと属性名を取り、その属性がそのオブジェクトに存在するかどうかを知らせると述べています。

クラス名でも機能するように見えることを発見しました(つまり、インスタンスオブジェクトではありません)。

何かのようなもの:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 

これを使用してテスト コードを簡単に記述できるようにしたいと考えていますが、これが実装の副作用であり、実際には意図されていない場合に備えて、後で噛まれたくはありません。

他に何かできるかどうかを確認するためにテスト コードを表示しないでください。それは実際の問題ではないからです。

これに関する公式のpythonスタンスはありますか?ドキュメントで参照されているオブジェクトは、インスタンスオブジェクトについて話していると思います。

私はグーグルを試しました(そしてStackOverflowでいくつかの質問を見ました)が、何も見つからなかったようです.

4

3 に答える 3

7

インスタンスに加えて機能するという事実classは、意図的なものです。実際、渡されたすべてのhasattrオブジェクトで機能するはずです。基本的には、次のようなことを行います。

def hasattr(obj, attribute):
    try:
        getattr(obj, attribute)
    except:
        return False
    return True

あなたはそれを信頼することができ、後で変化に巻き込まれることを恐れることはありません. hasattrpython-dev では、設計によって壊れていることについていくつかの議論があることに注意してください。その要点は、誤解を招く可能性のある例外をhasattrキャッチすることです。


Python クラスでは、それ自体が のインスタンスであることに注意してくださいtype

>>> class Foo(object):
...   pass
... 
>>> type(Foo)
<type 'type'>

したがって、すべてが何かのインスタンスです1

1typeはそれ自体のインスタンスであり、純粋な python では実行できないものです...

于 2015-04-27T16:10:40.027 に答える
3

「公式の Python スタンス」に関するリファレンスは手元にありませんが、これは完全に正常で意図的なものです。覚えておいてください

instance_of_SomeClass.some_method(parameters, ...)

実際には構文糖衣です

SomeClass.some_method(instance_of_SomeClass, parameters, ...)

つまり、これらのメソッドは実際にはクラスの属性であるため、でテストできますhasattr

于 2015-04-27T16:13:58.663 に答える
1

参照が欲しいだけです(すべてがオブジェクトであるという文についても...)

この章 (時間があれば本全体) を読むことをお勧めします。

http://www.diveintopython.net/getting_to_know_python/everything_is_an_object.html

于 2015-04-27T16:17:11.650 に答える