你应该在Python中使用属性引用吗?

时间:2011-06-16 06:58:03

标签: python oop

允许'Attribute references'反对封装/数据隐藏。 在开发中我们应该避免使用它。对吗?

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'

MyClass.i=98765

5 个答案:

答案 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