2

これは重複としてマークされると確信していますが、私が見ているものを本当に理解していません. Descriptors に関する Python のドキュメントを確認しましたが、Python で「プログラミング」を始めて 2 週間が経ちましたが、何を探しているのかよくわかりません。

これは私が得たものです:

>>> class Blub(object):
...     def __init__(self, value):
...             print('Blub is ' + value)
...             self.value = value
...     def __get__(self):
...             print('Blub gets ' + self.value)
...             return self.value
...     def __set__(self, value):
...             print('Blub becomes ' + value)
...             self.value = value
...
>>> class Quish(object):
...     def __init__(self, value):
...             self.blub = Blub(value)
...     def __get__(self):
...             return self.blub
...     def __set__(self, value):
...             self.blub = Blub(value)
... 

以下は、私が起こりたいことであり、どうすればよいかわかりません。

>>> a = Quish('One')
Blub is One
>>> a.blub
Blub gets One
'One'
a.blub = 'Two'
Blub becomes Two

これを実現するには、Bub または Quish で何をすればよいでしょうか。ここには非常に単純なクラスがありますが、次のように入力した場合にのみ完全に機能する、より複雑なバージョンがあります。

>>> a.blub.__get__()

これらの記述子のポイントは、実際にget () とset () を記述する必要がないようにすることだと思いました。私が望むように動作させるにはどうすればよいですか、またはPythonでそれを行うことはできませんか?

4

1 に答える 1

2

通常、記述子を直接使用することはありませんがproperty、使いやすい方法で記述子を実装した を使用します。使用方法は次のとおりです。

class Quish(object):
    def __init__(self, value):
        self.blub = value

    @property
    def blub(self):
        print('Blub gets ' + self._blub)
        return self._blub

    @blub.setter
    def blub(self, value):
        print('Blub becomes ' + value)
        self._blub = value

本当に独自の記述子を書きたい場合、別のインスタンス属性としてではなく、型に直接設定する必要があるという問題があり、1 つの記述子に複数のインスタンスがあることに対処する必要があります。

class Blub(object):
    def __get__(self, instance, owner):
        print('Blub gets ' + instance._blub)
        return instance._blub

    def __set__(self, instance, value):
        print('Blub becomes ' + value)
        instance._blub = value


class Quish(object):
    blub = Blub()

    def __init__(self, value):
        self.blub = value
于 2013-11-08T03:03:02.720 に答える