0

以前に尋ねた質問に基づいて、取得だけでなく設定もできるクラス プロパティを考え出そうとしました。だから私はこれを書いてモジュールに入れましたutil:

class classprop(object):
    def __init__(self, fget, fset=None):
        if isinstance(fget, classmethod):
            self.fget = fget
        else:
            self.fget = classmethod(fget)
        if not fset or isinstance(fset, classmethod):
            self.fset = fset
        else:
            self.fset = classmethod(fset)
    def __get__(self, *a):
        return self.fget.__get__(*a)()
    def __set__(self, cls, value):
        print 'In __set__'
        if not self.fset:
            raise AttributeError, "can't set attribute"
        fset = self.fset.__get__(cls)
        fset(value)

class X(object):
    @classmethod
    def _get_x(cls):
        return 1
    @classmethod
    def _set_x(cls, value):
        print 'You set x to {0}'.format(value)
    x = classprop(fget=_get_x, fset=_set_x)

取得が機能している間、設定が呼び出されていないようです:

>>> util.X.x
1
>>> util.X.x = 1
>>> 

私は何を間違っていますか?

(そして、これの実装が少し異なって動作するのを見てきました。特に、この実装が機能しない理由を知りたいと思っています。)

4

1 に答える 1

0

ドキュメントの言う:

object.__set__(self, instance, value)所有者クラスのインスタンスインスタンスの属性を新しい値valueに設定するために呼び出されます。

for とは異なり、クラス属性__get__については触れていません。したがって、Python はクラス属性に対して何も呼び出しません。 __set__

于 2010-09-18T19:40:41.337 に答える