Should you use attribute references in Python?
允许"属性引用"是反对封装/数据隐藏的。在开发中,我们应该避免使用它。正确的?
1 2 3 4 5 6 7 | class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world' MyClass.i=98765 |
python肯定不是纯oop。首先,它不强制数据隐藏。此外,对象的用户可以动态添加属性。另外,库中有几个API使用函数式编程范式。另外,还有lambda函数(顺便说一下,它确实很酷)。
"数据隐藏"只是OOP的一个方面,而不是其定义的一部分。"封装"是一个单独的概念。
无论"纯OOP语言"是什么意思,python可能不是。
至于直接访问属性,在Python中实际上鼓励简单类使用它,而不是编写显式的getter和setter。阅读本文了解更多信息。
您发布的原始代码没有错,但根据上下文,您可能会考虑其他选择。
您可以这样使用属性修饰器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Pie(object): _flavour = None @property def flavour(self): return self._flavour @flavour.setter def flavour(self, value): self._flavour = value p = Pie() p.flavour = 'cherry' p.flavour >>> 'cherry' |
这实际上是一个getter/setter,但不需要类的用户使用像
如果您有不希望类用户访问的数据,可以在其前面加下划线或双下划线,例如
对。python相信开发人员可以自己做出选择。虽然您可以禁止访问爪哇和Cype中的一个属性,但在Python中,开发人员应该知道他不应该访问另一个类的属性。
可以在属性前面加上两个下划线,以使其更难访问。参见名称管理。