我一直在尝试在我的应用中使用属性而不是特定的setter和getter。它们似乎更加pythonic,通常使我的代码更具可读性。
除了一个问题之外,更具可读性:错别字。
考虑以下简单示例(注意,我的属性实际上做了一些处理,即使这里的示例只是设置或返回一个简单的变量)
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
任何仔细阅读的人都会看到输出:
100
100
200
糟糕。不应该是因为我做了一个错字 - 我写了paranName(两个n)而不是paramName。
在这个简单的例子中,这很容易调试,但在我的大项目中它一直在伤害我。因为当我意外地使用属性时,python愉快地创建了一个新变量,所以我的代码中出现了细微的错误。我发现有时难以追查的错误。更糟糕的是,我曾经两次使用相同的拼写错误(一次是我设置的,后来一次就像我一样)所以我的代码似乎工作但很久以后,当一个不同的代码分支最终试图访问这个属性(正确)我得到了错误的价值 - 但是我花了好几天才意识到我的结果有点偏差。
现在我知道这是一个问题,我花了更多的时间仔细阅读我的代码,但理想情况下我会有办法自动捕捉这种情况 - 如果我只想念一个我可以引入一个不显示的错误直到相当长的一段时间过去......
所以我想知道,我应该转而选择使用优质的老牌手机和吸气剂吗?还是有一些巧妙的方法来避免这种情况?人们只是依靠自己手动捕获这些错误吗?唉,我不是一个专业的程序员,只是有人试图在工作中完成一些工作,我真的不知道解决这个问题的最佳方法。
感谢。
P.S。 我知道这也是Python的好处之一,我并不抱怨。只是想知道我是否会更好地使用显式设置器和吸气剂。
答案 0 :(得分:3)
您是否尝试过静态分析工具? Here is a great thread about them.
答案 1 :(得分:2)
根据代码的工作方式,您可以尝试使用slots。当你尝试分配那些不在插槽中的东西时,你会得到一个AttributeError异常,这会使这种拼写错误变得更加明显。
答案 2 :(得分:0)
有时编译时检查确实可以节省时间。你似乎已经确定了一个这样的案例。偶然而不是谨慎的选择我使用吸气剂和二传手,我很高兴; - )