8

syspropsいくつかの定数が欲しいクラスがあります。ただし、これらの定数の値をデータベースから取得したいので、これらのクラス定数の1つにアクセスするたびに何らかのフックが必要です(インスタンス変数のgetattributeメソッドなど)。

class sysprops(object):
    SOME_CONSTANT = 'SOME_VALUE'

sysprops.SOME_CONSTANT  # this statement would not return 'SOME_VALUE' but instead a dynamic value pulled from the database.
4

3 に答える 3

3

これを行うのは非常に悪い考えだと思いますが、それは可能です。

class GetAttributeMetaClass(type):
    def __getattribute__(self, key):
        print 'Getting attribute', key

class sysprops(object):
    __metaclass__ = GetAttributeMetaClass
于 2013-03-05T01:52:51.390 に答える
2

他の2つの答えには有効な方法があります。私は「最小の魔法」のルートを取るのが好きです。

実際に使用せずに、メタクラスアプローチと同様のことを行うことができます。デコレータを使用するだけです。

def instancer(cls):
    return cls()

@instancer
class SysProps(object):
    def __getattribute__(self, key):
        return key # dummy

これにより、のインスタンスが作成SysPropsされ、名前に割り当てられSysPropsます。実際のクラス定義を効果的にシャドウイングし、定数インスタンスを許可します。

Pythonではデコレータがより一般的であるため、コードを読まなければならない他の人にとって、この方法の方が理解しやすいと思います。

于 2013-03-05T01:56:50.763 に答える
0

sysprops.SOME_CONSTANTSOME_CONSTANTで定義されたプロパティの場合、関数の戻り値になる可能性がありますtype(sysprops)

言い換えれば、あなたが話していることはsysprops、クラスではなくインスタンスである場合に一般的に行われます。

しかし、ここにキッカーがあります-クラスはメタクラスのインスタンスです。したがって、クラスを使用してインスタンスの動作を制御することについて知っていることはすべて、メタクラスを使用してクラスの動作を制御することにも同様に当てはまります。

通常、メタクラスはtypeですが、サブクラス化することで他のメタクラスを自由に定義できますtype。プロパティSOME_CONSTANTをメタクラスに配置すると、そのメタクラスのインスタンスは、たとえばsyspropsPythonが評価するときに望ましい動作をしsysprops.SOME_CONSTANTます。


class MetaSysProps(type):
    @property
    def SOME_CONSTANT(cls):
        return 'SOME_VALUE'

class SysProps(object):
    __metaclass__ = MetaSysProps


print(SysProps.SOME_CONSTANT)

収量

SOME_VALUE
于 2013-03-05T01:50:01.827 に答える