4

私は次のようなコードを書くことができることを知っています:

class A :
    def __getattr__ (self, name) :
        return name

クラスのインスタンスで未定義の属性へのアクセスをトラップするには、次のようにします。

A().ATTR == 'ATTR'

です。しかし、クラス自体に対してこれを行う方法はありますか? 私ができるようにしたいのは、次の2行を両方とも機能させ、区別できるようにすることです(つまり、さまざまな魔法のメソッドが呼び出されているか、魔法のメソッドがどのように呼び出されたかを知ることができます)

a = A().ATTR
b = A.ATTR

答えはノーだと思いますが、おそらく深いpython ju-juがありますか?

編集: 実際の問題は、下位互換性のある方法でカスタム アクティブ レコード ライブラリを拡張することです。ORM コードは、次の行に沿ったコードをサポートします。

ar = AR_people()
ar.find()
name = ar.name

テーブルにアクセスします。ここnameでは、異なる列名にマップされる場合がありますpe_name。次のようなものを書きたい

ar.filter(AR_people.age >= 21)

そして最終的に

pe_age >= 21

(他の ORM ライブラリと同じように)、変換マジックを実行するためAR_people.ageに実装するクラスのインスタンスなどを返す必要があります。__ge__

4

2 に答える 2

7

メタクラスを使用できます:

In [1]: class meta(type):
   ...:     def __getattr__(self, name):
   ...:         return name
   ...:     
   ...:     

In [2]: class A(object):
   ...:     __metaclass__ = meta
   ...:     def __getattr__(self, name):
   ...:         return name
   ...:     
   ...:     

In [3]: A().attr
Out[3]: 'attr'

In [4]: A.attr
Out[4]: 'attr'
于 2012-07-19T10:47:12.103 に答える
2

はい、できます。メタクラスが答えです。

class MyMetaclass(type):
    def __getattr__(cls, name):
        return "cls.%s" % name


class A :
    __metaclass__ = MyMetaclass
    def __getattr__ (self, name) :
        return name

print A().ATTR
print A.ATTR

出力します

ATTR
cls.ATTR
于 2012-07-19T10:52:50.027 に答える