繁体   English   中英

在类方法中安全使用属性名称?

[英]Safe to use property names inside class methods?

给定一个具有只读属性的类,可以很容易地修改它:

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方法的情况下验证值。

有没有人有这种问题的经验? 如果你这样做,你是如何解决的?

好吧,我不确定这里是否有一个好的解决方案,所以我选择了另一种选择:如果用户试图做一些混乱的事情,那就是他们自己的错。 毕竟,Python是“成人同意的语言”。

仅仅因为PEP 8标准的属性通常是“公共的”,这并不意味着类的用户可以随意使用其属性做任何事情,无论是替换它们的值,改变它们,还是删除它们。 这自然也适用于属性,它们是类属性。

我会暂时解决这个问题,但我相当肯定这种态度是解决这个“问题”的正确方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM