Python中的“ public”或“ private”属性?什么是最好的方法?

发布于 2021-01-29 19:03:58

在Python中,我有以下示例类:

class Foo:
    self._attr = 0

    @property
    def attr(self):
        return self._attr

    @attr.setter
    def attr(self, value):
        self._attr = value

    @attr.deleter
    def attr(self):
        del self._attr

如您所见,我有一个简单的“私有”属性“ _attr”和一个用于访问它的属性。有很多代码可以声明一个简单的私有属性,我认为这样声明所有属性并不符合“
KISS”哲学。

因此,如果我不需要特定的getter / setter / deleter,为什么不将我的所有属性都声明为公共属性呢?

我的回答是:因为封装原理(OOP)另有说明!

什么是最好的方法 ?

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    通常,Python代码会努力遵守统一访问原则。具体来说,公认的方法是:

    • 直接公开您的实例变量,例如允许,而foo.x = 0不是foo.set_x(0)
    • 如果出于任何原因需要将访问包装在方法内部,请使用@property,以保留访问语义。即,foo.x = 0现在调用foo.set_x(0)

    这种方法的主要优点是调用者可以执行以下操作:

    foo.x += 1
    

    即使代码可能确实在做:

    foo.set_x(foo.get_x() + 1)
    

    第一条语句无限地可读。但是,有了属性,您可以(在开始或以后)添加使用第二种方法获得的访问控制。

    同样要注意,以单个下划线开头的实例变量 通常也是
    私有的。也就是说,下划线向其他开发人员发出信号,表示您认为该值是私有的,他们不应直接与之混淆。但是,该语言中的任何内容都不能 阻止
    他们直接对其进行弄乱。

    如果使用双引号下划线(例如__x),Python会对名称进行一些混淆。但是,仍然可以通过混淆的名称从类外部访问该变量。它不是真正的私人。只是有点…更不透明。还有反对使用双下划线的有效论点。一方面,它会使调试更加困难。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看