3

私はおそらくいくつかの基本的な間違いを犯しています...

オブジェクトのプロパティを初期化して確認すると、問題ありません。しかし、設定しようとしても、オブジェクト自体は更新されません。設定して取得できるプロパティを定義しようとしています。面白いことに、この長方形は幅の代わりに幅の2倍を格納するため、ゲッターとセッターはコピーするだけでなく、何かすることがあります。

class Rect:
    """simple rectangle (size only) which remembers double its w,h
       as demo of properties
    """

    def __init__(self, name, w):
        self.name=name
        self.dwidth=2*w

    def dump(self):
    print "dwidth = %f"  %  (self.dwidth,)


    def _width(self):
        return self.dwidth/2.0

    def _setwidth(self,w):
        print "setting w=", w
        self.dwidth=2*w
        print "now have .dwidth=", self.dwidth

    width =property(fget=_width, fset=_setwidth)

.dwidthメンバー変数は通常プライベートですが、インタラクティブセッションで簡単に確認したいと思います。Pythonコマンドラインで試してみます。

bash 0=> python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rectzzz import *
>>> a = Rect("ack", 10.0)
>>> a.dump()
dwidth = 20.000000
>>> a.width
10.0
>>> a.width=100
>>> a.width
100
>>> a.dump()
dwidth = 20.000000
>>> a.dwidth
20.0
>>> 

.widthが更新されているように見えるのに、dump()と.dwidthで示されるオブジェクトの実際の状態は変わらないのはなぜですか?「settingw=」の後に数字が表示されない理由は特に困惑しています。

4

1 に答える 1

7
class Rect:
    """simple rectangle (size only) which remembers double its w,h
       as demo of properties
    """

する必要があります:

class Rect(object):
    """simple rectangle (size only) which remembers double its w,h
       as demo of properties
    """

python 2.xでは、propertyから継承した場合にのみ正しく機能するobjectため、新しいスタイルクラスを取得できます。デフォルトでは、下位互換性のために古いスタイルのクラスを取得します。これはpython3.xで修正されています。

于 2012-11-04T20:06:24.857 に答える