给定一个具有只读属性的类,可以很容易地修改它:
cls.prop_name = property(cls.prop_name.fget, my_setter)
然而,可能del cls.prop_name
或者像我一样改变它。 PEP 8认为这是可以接受的,其中prop_name
是一个公共属性,因此可供类中的任何用户使用,但他们喜欢这类似,只需修改我隐藏在后面的非公共属性。属性直接并绕过我可能创建的任何检查,例如将RGB分量的值限制在0..255的范围内。
根据PEP 8,如果属性名称以下划线开头,这将是一个坏主意,但它没有,可以以某种方式删除或修改属性。这是属性要防止的确切类型,但通过删除或以其他方式更改属性,人们可以覆盖我的行为,如上所示。
这引出了我的问题:我应该在类中使用非公共验证setter方法,只是将其用作属性setter,或者我应该使用公共setter方法,因为验证非值的新值公共属性不是属性的预期用途?我试图避免代码重复,所以这些是我唯一允许用户访问的两个选项,同时还在属性设置器或setter方法的情况下验证值。
有没有人有这种问题的经验?如果你这样做,你是如何解决的?
答案 0 :(得分:0)
好吧,我不确定这里是否有一个好的解决方案,所以我选择了另一种选择:如果用户试图做一些混乱的事情,那就是他们自己的错。毕竟,Python是“成年人同意的语言”。
仅仅因为PEP 8标准的属性通常是“公共的”,这并不意味着一个类的用户只能用它的属性做任何他们想做的事,无论是替换它们的值,改变它们的位置,甚至是删除它们。这自然也属于属性,属于类属性。
我暂时不会回答这个问题,但我很确定这种态度是解决这个“问题”的正确方法。