4

djangoアプリケーション用のJiraクライアントをまとめたので、静的にする必要がありますが、静的フィールド@propertyに変換する方法がわかりません。@?.setter

私がクラスを持っているとしましょう:

class nothing(object):
    auth_token = None
    counter = 0

    @property
    def a(self):
        self.log('getter')
        if not self.auth_token:
            self.auth_token = 'default'
        return self.auth_token

    @a.setter
    def a(self, value):
        self.log('setter')
        self.auth_token = value

    def log(self, value):
        self.counter+=1
        print '{0} called / counter: {1}'.format(value, self.counter)

そして私はそのメソッドを静的にしたい:

class nothing:
    auth_token = None
    counter = 0

    @staticmethod
    def get_a():
        nothing.log('getter')
        if not nothing.auth_token:
            nothing.log('auth_token value is None, setting')
            nothing.auth_token = 'default'
        return nothing.auth_token

    @staticmethod
    def set_a(value):
        nothing.log('setter')
        nothing.auth_token = value

    @staticmethod
    def log(value):
        nothing.counter+=1
        print '{0} called / counter: {1}'.format(value, nothing.counter)

を呼び出すとオブジェクトが返され、実際には呼び出されないため、現在のget_aマークを付けることはできません。メソッドは私が一緒に暮らせるものですが、代わりにゲッター/セッターを使用する方法はありますか?@propertyget_a

4

2 に答える 2

6

最も簡単な方法は、このクラスをシングルトンにすることです。メソッドを静的にする代わりに、クラスをそのインスタンスでオーバーライドします。

nothing = nothing()

複数のインスタンスが必要な場合は、メタクラスを使用することもできます。

http://en.wikibooks.org/wiki/Python_Programming/MetaClasses

于 2012-09-08T12:50:10.640 に答える
1

Pythonのクラスプロパティが必要ですか?

これがゲッターの解決策です。セッターには、タイプ以外のメタクラスが必要です。

>>> class CP(object):
    def __init__(self, getter, setter = None):
        self._getter = getter
        self._setter = setter

    def setter(self, setter):
        self._setter = setter
    def __get__(self, obj, cls = None):
        print '__get__', obj, cls
        return self._getter(cls) # for static remove cls from the call
    def __set__(self, *args):
        print args


>>> class X(object):
    @CP
    def g(cls):
        print 'g', cls
        return 1


>>> X.g # getting returns value of g
__get__ None <class '__main__.X'>
g <class '__main__.X'>
1
>>> X().g
__get__ <__main__.X object at 0x02ACEC50> <class '__main__.X'>
g <class '__main__.X'>
1
>>> X.g = 3 # setting does not work
>>> X.g
3

しかし、私が見てみると:

>>> X().g = 3
(<__main__.X object at 0x02ACEE50>, 3)

__set__クラス側のプロパティを対象としていないようです。これは賢明な理由です。たとえば、呼び出されたproperty場合、クラス側で他にどのように上書きできるでしょうか。__set__

于 2012-09-08T15:30:45.463 に答える