在Python中使用属性上的运算符

时间:2013-05-25 07:55:50

标签: python properties python-3.x operators

目前使用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的属性与它们所代表的类型数据的行为不同,这与我熟悉的其他语言不同?

1 个答案:

答案 0 :(得分: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 is not Java

在Java中,您必须使用getter和setter,因为您无法改变主意并在以后将公共字段更改为getter和setter。在python中,你可以,所以在你真正需要之前不要使用getter和setter。

如果您想了解Python属性的工作原理,请阅读Python Descriptor HOWTO; property对象是一个描述符,Python类的方法也是如此;通过__get____set__方法的魔力,他们可以转换实例上的属性访问。