【问题标题】:Can PUBLIC attributes and methods (that work on public attributes) be considered as encapsulation?PUBLIC 属性和方法(适用于公共属性)是否可以被视为封装?
【发布时间】:2019-05-11 02:45:13
【问题描述】:

考虑一个简单的例子:

class encap:

    def __init__(self):
        self.attr=100

    def get_attr(self):
        print(self.attr)

obj=encap()
obj.get_attr()

请注意,这里我们并没有将属性设为私有,但它仍然绑定在一个类中,并且我们有一个访问它的方法。

我的问题是:

  1. 考虑到封装是指将数据与对该数据进行操作的方法捆绑在一起,即使我们没有将属性设为私有,上述示例是否仍能代表OOP的封装概念?

  2. 封装用于隐藏类中结构化数据对象的值或状态,防止未授权方直接访问它们。 因此,是否必须将属性设为私有以证明封装的合理性?

【问题讨论】:

  • 没有办法在 Python 中强制执行“私有”。但是你可以建立一个约定,如果某件事是私有的,那么每个人都会尊重它。放置一个 _ 作为属性前缀。或者如果你想要“隐私”真的很糟糕,可以加倍__。不遵守约定可能会破坏将来使用您的代码(客户端代码)的代码。

标签: python-3.x oop encapsulation


【解决方案1】:

封装意味着某些属性和某些操作在概念上是相互关联的。因此,您封装了 encap 对象。 你想说关于信息隐藏。 好的软件设计实现了高度的可维护性和可修改性。信息隐藏通过隐藏细节和只提供重要的接口来帮助它。

根据你的问题,

  1. 是的。它仍然代表封装。

  2. 没有。但是,如果您将其设为私有,则可以通过隐藏信息使其成为更好的软件设计。

查看您的代码,您将一个属性定义为公共属性并定义一个 setter 接口。该属性将能够通过 2 条路径访问。所以决定你是否将属性更改为私有或删除 setter 接口。

【讨论】:

  • 请注意,在 Python 中,属性是公共的,可以使用对象上的点表示法直接访问它们,因此编码 setter 和 getter 不如在 Java 中常见。仅当您希望对访问进行某种程度的属性保护或副作用处理时才这样做。定义一个 Python 属性会有所帮助。
猜你喜欢
  • 2017-11-23
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多