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 中,您必须使用 getter 和 setter,因为您以后无法改变主意并将公共字段更改为 getter 和 setter。在python中,你可以,所以在你有实际需要之前不要使用getter和setter。

如果你想了解 Python 属性如何工作的全部细节,请阅读Python Descriptor HOWTO;该property对象是一个描述符,Python 类的方法也是如此;通过魔法__get____set__方法,它们改变了对实例的属性访问。

于 2013-05-25T07:59:47.977 回答