【发布时间】:2019-06-09 02:22:33
【问题描述】:
我对 python 中的面向对象概念很天真。在阅读 here 的 OOP 概念时,我遇到了一个例子。
class P1:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.__x = 0
elif x > 1000:
self.__x = 1000
else:
self.__x = x
e = P(x = 2100)
f = e.x*2
print(f)
2000
如果我不将我的变量设为私有(对于 P2 类),那么我猜它会陷入无限循环。
class P2:
def __init__(self,x):
self.x = x
@property
def x(self):
return self.__x
@x.setter
def x(self, x):
if x < 0:
self.x = 0
elif x > 1000:
self.x = 1000
else:
self.x = x
e = P(x = 2100) #Infinite loop
为了检查 P2 类实际在做什么,我将代码重组为
class P2:
def __init__(self,x):
print('init area1')
self.x = x
@property
def x(self):
print('property area2')
return self.x
@x.setter
def x(self, x):
print('setter area3')
if x < 0:
print('setter area4')
self.x = 0
elif x > 1000:
print('setter area5')
self.x = 1000
else:
print('setter area6')
self.x = x
当我尝试运行 P2(x = 2100) 时,它给了我一个不可阻挡的输出,例如:
init area1
setter area3
setter area5
setter area3
setter area6
setter area3
setter area6
setter area3
setter area6.......
看来我的程序首先调用了 init 方法,然后它不断地从 setter area 3 到 setter area 6 来回运行。 谁能解释一下
幕后发生了什么?程序运行情况如何?
为什么要在这里制作魔术私有属性以使程序不会陷入无限循环
@property 和 @x.setter 在这里如何相互关联?我不能不写@property就写@setter
我知道这些是基本问题,但我浏览了很多在线资料,但没有找到更好的答案。
【问题讨论】:
标签: python python-3.x class oop private