我来自Java世界,正在阅读Bruce Eckels的《Python 3 Patterns, Recipes and idiom》。
在阅读有关类的内容时,会继续说在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 3中,如果你只是想“封装”类属性,就像在Java中一样,你可以这样做:
class Simple:
def __init__(self, str):
print("inside the simple constructor")
self.__s = str
def show(self):
print(self.__s)
def showMsg(self, msg):
print(msg + ':', self.show())
要实例化此操作:
ss = Simple("lol")
ss.show()
注意:print(ss.__s)将抛出一个错误。
实际上,Python 3会混淆全局属性名。就像在Java中一样,它将此转换为“私有”属性。属性名仍然是全局的,但是以一种不可访问的方式,就像其他语言中的私有属性一样。
但是不要害怕。没关系。它也起作用了。;)
“在java中,我们学习了公共/私有/受保护变量”
“为什么在python中不需要这个?”
出于同样的原因,它在Java中不是必需的。
您可以自由使用或不使用private和protected。
作为Python和Java程序员,我发现私有和受保护是非常非常重要的设计概念。但实际上,在数万行Java和Python代码中,我从未真正使用过private或protected。
为什么不呢?
我的问题是"被谁保护?"
我团队中的其他程序员?他们有消息来源。当他们可以改变的时候,保护意味着什么?
其他团队的其他程序员?他们在同一家公司工作。只要打个电话,他们就能找到线人。
客户吗?这是一种雇佣式编程(通常)。客户机(通常)拥有代码。
那么,我到底在保护谁呢?
在Python 3中,如果你只是想“封装”类属性,就像在Java中一样,你可以这样做:
class Simple:
def __init__(self, str):
print("inside the simple constructor")
self.__s = str
def show(self):
print(self.__s)
def showMsg(self, msg):
print(msg + ':', self.show())
要实例化此操作:
ss = Simple("lol")
ss.show()
注意:print(ss.__s)将抛出一个错误。
实际上,Python 3会混淆全局属性名。就像在Java中一样,它将此转换为“私有”属性。属性名仍然是全局的,但是以一种不可访问的方式,就像其他语言中的私有属性一样。
但是不要害怕。没关系。它也起作用了。;)