1

Pythonの所有者クラスで割り当てられている名前を出力するプロパティを取得しようとしています。プロパティが直接割り当てられている場合にのみ機能するように見えるメソッドを作成しました。以下に示すように、プロパティが継承されている場合は機能しません。Handler.CLIENT_IDどちらかを呼び出すかSubHandler.CLIENT_ID、変数名CLIENT_IDが常に出力されるようにするための良い方法は何ですか?

class Auto(object):
    def __get__(self, instance, owner):
        attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next()
        return attr_name

class Handler(object):
    name = 'account'

    CLIENT_ID = Auto()

class SubHandler(Handler):
    pass

h = Handler()
print h.CLIENT_ID
# prints CLIENT_ID
s = SubHandler()
print s.CLIENT_ID
# Traceback (most recent call last):
#    attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next()
# StopIteration
4

1 に答える 1

2

クラスの属性を使用して基本クラスをトラバースし__mro__、各クラスのプロパティを探すことができ__dict__ます。

class Auto(object):
    def __get__(self, instance, owner):
        attr_name = (k 
            for klass in owner.__mro__
            for (k, v) in klass.__dict__.iteritems() 
            if v == self).next()
        return attr_name

「mro」はメソッド解決の順序を表し、Pythonがメソッドおよびその他のクラス定義属性を検索する順序での基本クラスのリストです。このリストをスキャンすると、Pythonが使用するのと同じ順序で基本クラス全体のプロパティを検索することになります。

サンプルコードは、上記のコードで正しく機能します。

>>> h = Handler()
>>> print h.CLIENT_ID
CLIENT_ID
>>> s = SubHandler()
>>> print s.CLIENT_ID
CLIENT_ID
于 2012-09-29T17:41:10.033 に答える