当前位置: 首页 > 面试题库 >

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

卜方伟
2023-03-14
问题内容

在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)另有说明!

什么是最好的方法 ?


问题答案:

通常,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会对名称进行一些混淆。但是,仍然可以通过混淆的名称从类外部访问该变量。它不是真正的私人。只是有点…更不透明。还有反对使用双下划线的有效论点。一方面,它会使调试更加困难。



 类似资料:
  • 问题内容: 我正在学习node.js并表示,我想知道./package.json文件中的“私有”属性是用来做什么的吗? 问题答案: 取自本网站https://docs.npmjs.com/files/package.json#private 如果您在package.json中设置“ private”:true,则npm将拒绝发布它。 这是防止意外发布私有存储库的方法。

  • 问题内容: python中最好的方法是什么:if语句中的 OR 或 IN ?考虑性能和最佳实践。 要么 谢谢。 问题答案: 最好的方法是使用 set : 因为集合中的成员资格测试为O(1)(不变成本)。 其他两种方法的复杂度相同。只是固定成本的差异。测试既有清单又有链条短路;找到匹配项后立即终止。一种使用字节码跳转序列(如果为,则跳转到末尾),另一种使用C循环,如果值匹配则使用早期退出。在最坏的情

  • 问题内容: 在Java中,方法成为public / private / other是什么意思? 这些选择的优点和缺点是什么? 作为努力成为一名优秀程序员的人,我的动力是什么? 问题答案: 当一个方法 公开时 ,意味着它可以被其他对象访问 例如: 该方法可以被其他类访问,因为它是公共的: 优点..您可以从其他地方使用它。 如果方法是 私有的,* 则意味着该方法只能由 同一类的 对象访问 * 例如,在

  • 问题内容: 每次定义一个类时,无需像这样编写代码: 我可以使用此配方进行自动属性分配。 两个问题 : 此快捷方式是否有缺点或陷阱? 有没有更好的方法来实现类似的便利? 问题答案: 关于自动分配代码的某些问题会困扰我(主要是样式问题,但还有一个更严重的问题): 没有分配’args’属性: a=Foo(‘IBM’,’/tmp’,True, 100, 101) print(a.args) 就像一个装饰者

  • 我和JNI有一个Android项目。在实现侦听器类的CPP文件中,有一个回调x()。调用x()函数时,我想调用java类中的另一个函数。然而,为了调用该java函数,我需要访问JNIEnv*。 我知道在回调的同一个cpp文件中,有一个函数: 当

  • 问题内容: 我只想知道 到底是 什么 意思 ?甚至在SO上也没有在官方文档中找到任何解释。 如果您能提供一些例子,我将非常高兴。 问题答案: 请参阅PEP 366 和导入系统参考文档: 提议的主要更改是引入了新的模块级别属性。如果存在,则相对导入将基于此属性而非模块属性。 和 * 应该设置模块的属性。它的值必须是字符串,但可以与其值相同。如果该属性设置为或丢失,则导入系统将使用更合适的值填充该属性