0

現在Python 3.2.3を使用しています:

Python でプロパティを使用すると、常に問題が発生します。私の問題が Python でのプロパティの動作方法 (私は C++/Delphi/C# の世界から来ました) によるものなのか、それとも私が間違っていることによるものなのかはわかりません:

例:

意味:

    class MyClass(object):

            ...

      self.__stringProp = "Mikey"

      @property
      def StringProp(self):
        return self.__stringProp

使用法:

p  = "Python"
m = p + MyClass.StringProp

エラー:

Unsupported operand type(p) for +: 'property' and 'str'

多くの同様のケースで同じです-その型のプロパティの型に演算子を使用できません。または、クラスのインスタンスをプロパティとして公開すると、プロパティとしてアクセスされるため、クラスの呼び出し可能オブジェクトにアクセスできません。

私は何か間違ったことをしていますか、それとも Python のプロパティは、私がよく知っている他の言語とは異なり、それらが表す型付きデータとは異なる動作をしますか?

4

1 に答える 1

3

プロパティは、クラスのインスタンスでのみ機能します。クラスで、プロパティ オブジェクト自体に直接アクセスしています。

>>> class Foo:
...     @property
...     def bar(self):
...         return 'Hello world!'
... 
>>> Foo.bar
<property object at 0x101455f70>
>>> foo = Foo()
>>> foo.bar
'Hello world!'

これFooがクラスでfooあり、そのクラスのインスタンスです。

属性を読み取り専用にする必要がある場合、またはコードを実行して値を取得または設定する必要がある場合にのみ、プロパティを使用してください。Java のように属性を使用しないでください。Python ではその必要はありません。PythonはJavaではありません

Java では、後から気が変わってパブリック フィールドをゲッターとセッターに変更できないため、ゲッターとセッターを使用する必要があります。Python ではできるので、実際に必要になるまでゲッターとセッターを使用しないでください。

Python プロパティがどのように機能するかを完全に知りたい場合は、Python Descriptor HOWTOを読んでください。Python クラスのメソッドと同様に、propertyオブジェクトは記述子です。__get__およびメソッドの魔法により、__set__インスタンスの属性アクセスを変換します。

于 2013-05-25T07:59:47.977 に答える