在c ++实例中,默认情况下变量是私有的,Python变量默认是公共的
我有两个相同的问题: -
1:为什么Python默认情况下所有成员都是公开的?
2:人们说你的会员数据应该是私密的 如果我将我的数据公开怎么办? 这个approch的缺点是什么? 为什么这是一个糟糕的设计?
答案 0 :(得分:13)
您可以在名称中使用前导下划线告诉读者代码中有关名称是内部详细信息,并且他们不得依赖于未来版本中的名称。这样的惯例实际上就是你需要的 - 为什么要用执行机制来衡量语言呢?
数据,就像方法一样,如果它们是你想要支持的类的设计API的一部分,那么它应该是公共的(没有前导下划线命名)。在C ++或Java中,这种情况不太可能发生,因为如果你想将数据成员更改为访问器方法,那你就不走运了 - 你必须打破你的API并且每个类的客户都必须变化
在Python和支持类似property
的构造的其他语言中,情况并非如此 - 您始终可以使用透明调用访问器方法的属性替换数据成员,API不会更改,也不会客户代码。所以,在Python和其他语言中使用property
类似的构造(我相信.NET语言就是这样,在源代码级别,但不一定是在字节码级别),你可以将它的数据保留为公共部分当前需要API并且不需要访问器(如果需要,您可以随时将访问器方法添加到以后的实现版本中,而不是破坏API)。
所以它不是一般的OO问题,它是特定于语言的:给定的语言是否支持类似属性的构造。 Python确实。
答案 1 :(得分:3)
我无法评论Python,但在C ++中,结构体默认提供公共访问。
你想要一个私人部分的主要原因是,没有一个,就不可能保证你的不变量得到满足。例如,如果你有一个字符串类,它应该跟踪字符串的长度,你需要能够跟踪插入。但如果基础char*
成员是公开的,那么你就不能这样做。任何人都可以来到最后,或者覆盖你的空终结符,或者在它上面调用delete[]
,或者其他什么。当您致电length()
会员时,您只需要充分希望。
答案 2 :(得分:1)
这真的是语言设计哲学的问题。我赞成Python阵营,所以可能会对C ++风格有点粗暴,但最重要的是,在C ++中,可以强制阻止你的类的用户访问某些内部部分。
在Python中,这是一个常规问题,并声明它是内部的。某些应用程序可能希望访问内部成员以用于非恶意目的(例如,文档生成器)。一些知道他们正在做什么的用户可能也希望这样做。那些想要在内心细节上挣扎自己的人不能免于自杀。
就像丹尼斯所说的那样“任何人都可以来到最后,或者覆盖你的空终结者”。 Python像对待成年人一样对待用户并希望她能够照顾好自己。 C ++可以像孩子一样保护用户。
答案 3 :(得分:0)