如果我让我的班级成员公开呢?

2024-07-04 16:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在c++中,实例变量在默认情况下是私有的,在Python中,实例变量默认是公共的

我有两个关于相同:在

1:为什么Python默认所有成员都是公共的?在

2:有人说你应该把你的会员资料保密 如果我公开我的数据呢? 这种方法的缺点是什么? 为什么这是一个糟糕的设计?在


Tags: 数据实例方法情况成员缺点保密会员资料
3条回答

我不能评论Python,但是在C++中,Struts默认提供了公共访问。在

想要类的私有部分的主要原因是,没有私有部分,就无法保证满足不变量。例如,如果您有一个string类,它应该跟踪字符串的长度,那么您需要能够跟踪插入。但是如果底层的char*成员是公共的,则不能这样做。任何人都可以在末尾加上一些东西,或者重写空终止符,或者调用delete[]或者其他什么。当你给你的length()成员打电话时,你只需要抱着最好的希望。在

可以在名称中使用前导下划线来告诉代码的读者,所讨论的名称是一个内部细节,在将来的版本中不能依赖它。这样的约定真的就是你所需要的——为什么要用一种强制执行机制来衡量这种语言呢?在

与方法一样,如果数据是类设计的API的一部分,那么它们应该是公共的(命名时没有前导下划线),并且您打算继续支持这些API。在C++或java中,这是不可能发生的,因为如果你想把数据成员更改为访问器方法,那么你就不走运了,你必须打破API,并且每个类的客户端都必须改变。在

在Python和其他支持类似property结构的语言中,情况并非如此——您始终可以用透明地调用访问器方法的属性替换数据成员,API不会更改,客户端代码也不会更改。因此,在Python和其他具有类似property结构的语言中(我相信.NET语言是这样的,在源代码级别,尽管不一定是字节码级别),当数据是API的一部分并且当前不需要访问器时,您也可以将数据公开(如果需要,您可以随时将访问器方法添加到以后的实现版本中)不会破坏API)。在

所以这并不是一个一般的OO问题,而是特定于语言的问题:给定的语言是否支持类似属性的构造。Python会的。在

这实际上是一个语言设计哲学的问题。我赞成Python阵营,所以可能会对C++风格有点粗暴,但最重要的是,C++中有可能强制阻止用户访问某些内部部件。在

在Python中,这是一个约定问题,并声明它是内部的。一些应用程序可能希望出于非恶意目的访问内部成员(例如文档生成器)。一些知道自己在做什么的用户可能也希望这样做。那些想在玩弄内部细节的情况下开枪自杀的人是不会被保护起来的。在

就像丹尼斯所说的“任何人都可以过来把东西钉到最后,或者覆盖你的空终结者”。Python把用户当作成年人对待,希望她能照顾好自己。C++保护用户,就像一个孩子一样。在

相关问题 更多 >

    热门问题