关于oop:应该在python中使用属性引用吗?

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,但不需要类的用户使用像p.get_flavour()这样的方法。它还具有允许用户直接访问数据的优点,因为您可以在getter和setter中添加逻辑(例如在getter中缓存值)。

如果您有不希望类用户访问的数据,可以在其前面加下划线或双下划线,例如_flavour。用户仍然可以通过调用pie._flavour来访问它,但是下划线表示您不应该以这种方式使用它。有关这一点的讨论,请参见Python中的私有变量和方法。


对。python相信开发人员可以自己做出选择。虽然您可以禁止访问爪哇和Cype中的一个属性,但在Python中,开发人员应该知道他不应该访问另一个类的属性。

可以在属性前面加上两个下划线,以使其更难访问。参见名称管理。