Skip to main content
 首页 » 编程设计

python之无意中绕过 Python 的私有(private)属性

2025年05月04日13sxdcgaq8080

我设法使用以下代码绕过 setter :

t = TrajetGPS() 
 
# will call t.getPoints(), which will return the list by reference 
# we can then modify it at will, bypassing the setter 
points = t.points  
points.append(PointGPS(0, 0, 0)) 
points.append(PointGPS(1, 1, 1)) 
 
 
print(t) # will show : Points : (0, 0, 0) (1, 1, 1) 

TrajetGPS()被定义为包含 PointGPS 列表的简单类用 points = property(getPoints, setPoints) 定义和 PointGPS()包含 3 个坐标(纬度、经度、高度)。但这一切在这里都不重要。

我可以在没有警告的情况下绕过 setter 是否正常?

Python 被设计为对初学者友好,但这似乎不太友好,因为它可以非常快速地将格式错误的数据插入列表(不知道!)。

请您参考如下方法:

您实际上并不是在“绕过 setter”——当您尝试设置 t.points 时会调用 setter(即:t.points = []),不是在您改变 setter 返回的列表时。

如果您不希望客户端代码改变列表,要么返回一些不可变的结构(这将明确它不应该被改变)或者至少返回列表的副本(它仍然是可变的,但修改不会影响原始列表 - 请注意,这可能会让您的代码用户感到惊讶)。

注意:在您的代码片段中有这样的注释:

which will return the list by reference

如果您希望用 Python 完成任何事情,请停止从其他语言的角度思考,而是了解 Python 的工作原理。 Python 中没有“按引用”或“按值”之类的东西,只有名称和对象。您的 getter 不会“通过引用返回列表”,它会返回列表,期间。我强烈建议你 read this reference article (是的,蹩脚的双关语,抱歉)有关 Python 的名称和对象概念的更多信息。