我来自Java世界,正在阅读布鲁斯·埃克尔斯(Bruce Eckels)的"Python 3 Patterns, Recipes and Idioms".

在阅读有关类的内容时,它接着说,在Python中,不需要声明实例变量.你只要在构造器中使用它们,它们就在那里.

例如:

class Simple:
    def __init__(self, s):
        print("inside the simple constructor")
        self.s = s

    def show(self):
        print(self.s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

如果这是真的,那么类Simple的任何对象都可以在类之外更改变量s的值.

例如:

if __name__ == "__main__":
    x = Simple("constructor argument")
    x.s = "test15" # this changes the value
    x.show()
    x.showMsg("A message")

在Java中,我们学习了公共/私有/受保护变量.这些关键字是有意义的,因为有时你需要一个类中的变量,而这个类之外的任何人都无权访问它.

为什么Python中不需要这样做?

推荐答案

这是文化.在Python中,您不会写入其他类的实例或类变量.在Java中,如果你愿意,没有什么可以阻止你做同样的事情——毕竟,你可以编辑类本身的源代码来达到同样的效果.Python放弃了安全性的伪装,鼓励程序员负责任.实际上,这非常有效.

如果出于某种原因希望模拟私有变量,则始终可以使用PEP 8中的__前缀.Python会 destruct 变量的名称,比如__foo,这样它们就不容易被包含它们的类之外的代码看到(尽管如果你有足够的决心,你可以绕过它,就像你在使用它时绕过Java的保护一样).

按照同样的约定,_前缀表示stay away even if you're not technically prevented from doing so.你不能随意使用另一个类中看起来像__foo_bar的变量.

Python相关问答推荐

如何将不同长度的新列添加到现有的框架中

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

如何让 turtle 通过点击和拖动来绘制?

在Python中对分层父/子列表进行排序

在Python中处理大量CSV文件中的数据

删除最后一个pip安装的包

在Pandas DataFrame操作中用链接替换'方法的更有效方法

如何记录脚本输出

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

无法定位元素错误404

pyscript中的压痕问题

Pandas计数符合某些条件的特定列的数量

删除marplotlib条形图上的底边

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

Python—为什么我的代码返回一个TypeError

从源代码显示不同的输出(机器学习)(Python)

使用Python异步地持久跟踪用户输入

为什么t sns.barplot图例不显示所有值?'