44

それはすべてタイトルにあります。以下に例を示します。

class A(object):
    my_var = 5

    def my_method(self, drink='beer'):
        return 'I like %s' % drink

    @property
    def my_property(self):
        return 'I do not drink coffee'

A オブジェクトをインスタンス化し、各属性の型とそれが呼び出し可能かどうかを知りたいです。このために私は使用してdir()います。

obj = A()

for attr in dir(obj):
    print 'Type: %s' % type(obj)
    print 'Is callable: %s' % callable(attr)

属性がプロパティであるかどうかも知っておく必要があります。これを知る方法があると確信しています。すべての提案をいただければ幸いです。

4

4 に答える 4

39

__class__クラスを調べる必要があります (これは一般的に記述子の場合です)。オブジェクトの場合は、属性を介して、または type 関数を使用して見つけることができます。

>>> obj.__class__.my_property
<property object at 0xb74bd16c>

またはによって

>>> type(obj).my_property
<property object at 0xb720b93c>

これらは、クラスの属性を直接チェックする場合と同じ "プロパティ オブジェクト" になります (おそらく行うべきように動的にチェックするのではなく、コードでクラスの名前を知っていることを意味します)。

>>> A.my_property
<property object at 0xb7312345>

したがって、オブジェクトの特定の属性がプロパティであるかどうかをテストするには、これが 1 つの解決策になります。

>>> isinstance(type(obj).my_property, property)
True
于 2013-07-18T23:28:56.053 に答える
27

私はかつて同様の質問をしました。もちろん、遭遇する問題は、ゲッターを呼び出さずにインスタンスを介してプロパティにアクセスしてそのタイプを決定できないことです。ゲッターは、ゲッターが返すもののタイプを取得します。そのため、インスタンスではなくクラスを介してプロパティにアクセスする必要があります。

propertyはすでに型なので、それと直接比較できます。(もともと、プロパティを持つクラスからプロパティの型を取得する余分なコードがいくつかありました。これは、テスト中にタイプミスがあったために必要だと思いました。)

obj_type = type(obj)

for attr in dir(obj):
    if isinstance(getattr(type(obj), attr, None), property):
        print attr, "is a property"

同じ名前のインスタンス アトリビュートがあることを心配する必要はありません。クラスに同じ名前のデータ記述子がある場合、属性ルックアップでは無視されます (propertyはデータ記述子です)。

もちろん、 だけでなく、任意のクラスがデータ記述子になる可能性があるため、理論的には、型のand/or and/or 属性propertyを実際にチェックする必要があります。しかし、そのアプローチの問題は、すべての関数とメソッド自体が記述子であるため、そのチェックによってキャッチされることです。すべての例外を見つけようとするのは、すぐにばかげたことになります。__get__()__set__()__delete__()

于 2013-07-18T23:28:10.183 に答える