目前使用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的属性与它们所代表的类型数据的行为不同,这与我熟悉的其他语言不同?
答案 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__
方法的魔力,他们可以转换实例上的属性访问。