允许'Attribute references'反对封装/数据隐藏。 在开发中我们应该避免使用它。对吗?
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
MyClass.i=98765
答案 0 :(得分:2)
“数据隐藏”只是OOP的一个方面,而不是其定义的一部分。而“封装”是一个单独的概念。
答案 1 :(得分:2)
Python当然不是纯粹的OOP。首先,它不强制数据隐藏。此外,对象的用户可以动态添加属性。此外,库中有几个使用函数式编程范例的API。另外,还有lambda函数(顺便说一句,这很酷)。
答案 2 :(得分:1)
无论“纯OOP语言”是什么意思,Python可能不是它。
至于直接访问属性,在Python中实际上鼓励使用简单的类,而不是编写显式的getter和setter。请阅读this article以获取更多信息。
答案 3 :(得分:0)
是。 Python信任开发人员自己做出选择。虽然你可以禁止访问Java和C#中的属性,但在Python中,开发人员应该知道他不应该访问另一个类的属性。
您可以使用两个下划线为属性添加前缀,以使其更难访问。请参阅name mangling。
答案 4 :(得分:0)
您发布的原始代码没有任何问题,但根据具体情况,您可能会考虑其他替代方案。
你可以像这样使用属性装饰器:
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,但不要求你的类用户使用p.get_flavour()
之类的方法。它还具有优于让用户直接访问数据的优点,因为您可以在getter和setter中添加逻辑(例如,在getter中缓存值)。
如果您有不希望类的用户访问的数据,您可以在其前面添加下划线或双下划线,例如。 _flavour
。用户仍然可以通过调用pie._flavour
来访问它,但是下划线表示您不打算以这种方式使用它。有关此问题的讨论,请参阅Private Variables and Methods in Python。