我一直在尝试在我的应用程序中使用属性而不是特定的setter和getter。它们看起来更像Python,而且通常使我的代码更具可读性。在
除了一个问题:打字错误外,可读性更强。在
考虑下面这个简单的例子(注意,我的属性实际上做了一些处理,尽管这里的示例只是设置或返回一个简单的变量)
class GotNoClass(object):
def __init__(self):
object.__init__(self)
self.__a = None
def __set_a(self, a):
self.__a = a
def __get_a(self):
return self.__a
paramName = property(__get_a, __set_a)
if __name__ == "__main__":
classy = GotNoClass()
classy.paramName = 100
print classy.paramName
classy.paranName = 200
print classy.paramName
#oops! Typo above! as seen by this line:
print classy.paranName
任何仔细阅读的人都会发现,结果是:
^{pr2}$哦。不应该,除非我犯了个错误-我写了paranName(两个n)而不是paramName。在
在这个简单的例子中,这很容易调试,但在我更大的项目中它一直在伤害我。由于python很乐意在我无意中使用属性时创建了一个新变量,所以我的代码中会出现一些细微的错误。有时我发现很难找到的错误。更糟糕的是,我曾经用过两次同样的错别字(一次是我设置的,后来一次是我得到的),所以我的代码似乎可以正常工作,但是很久以后,当一个不同的代码分支最终尝试(正确地)访问这个属性时,我得到了一个错误的值-但是我花了几天时间才意识到我的结果有点偏差。在
现在我知道这是一个问题,我花了更多的时间仔细阅读我的代码,但理想情况下,我会有一种方法自动捕捉这种情况-如果我错过了一个,我可以引入一个错误,直到一段相当长的时间过去后才会出现。。。在
所以我想知道,我是不是应该改用好的旧的setter和getter?或者有什么好办法可以避免这种情况?人们仅仅依靠自己手动捕捉这些错误吗?唉,我不是一个专业的程序员,只是一个想在工作中完成一些事情的人,我真的不知道最好的方法。在
谢谢。在
p.S。 我知道这也是Python的一个优点,我对此并不抱怨。只是想知道使用显式setter和getter是否更好。在
有时编译时检查确实可以节省时间。你好像发现了一个这样的案子。我使用getters和setters是偶然的,而不是谨慎的选择;-)
根据代码的工作方式,可以尝试使用slots。当您尝试分配不在插槽中的内容时,会抛出AttributeError异常,这将使这种键入更加明显。在
你试过静态分析工具吗?Here is a great thread about them.
相关问题 更多 >
编程相关推荐