一般来说,您甚至不应该使用属性。简单的属性在绝大多数情况下都可以正常工作:
class X:
pass
>>> x = X()
>>> x.a
Traceback (most recent call last):
# ... etc
AttributeError: 'X' object has no attribute 'a'
>>> x.a = 'foo'
>>> x.a
'foo'
仅当您满足以下条件时才应使用财产:need访问属性时做一些工作:
import random
class X:
@property
def a(self):
return random.random()
>>> x = X()
>>> x.a
0.8467160913203089
如果您还需要能够分配给属性,则定义 setter 很简单:
class X:
@property
def a(self):
# do something clever
return self._a
@a.setter
def a(self, value):
# do something even cleverer
self._a = value
>>> x = X()
>>> x.a
Traceback (most recent call last):
# ... etc
AttributeError: 'X' object has no attribute '_a'
>>> x.a = 'foo'
>>> x.a
'foo'
请注意,在每种情况下,客户端代码访问特性或属性的方式完全相同。没有必要让你的类“面向未来”,以防在某些时候你可能想做一些比简单属性访问更复杂的事情,所以没有理由编写属性、getter 或 setter除非你现在确实需要它们.
有关属性、getter 和 setter 方面惯用的 Python 和其他一些语言之间的差异的更多信息,请参阅:
- 为什么你不需要 getter 和 setter?
-
Python 不是 Java(尤其是“Getters 和 Setters 是邪恶的”部分)