不知道我是否应该在python中使用属性

2024-09-28 22:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试在我的应用程序中使用属性而不是特定的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是否更好。在


Tags: 代码self属性def错误时间情况例子
3条回答

有时编译时检查确实可以节省时间。你好像发现了一个这样的案子。我使用getters和setters是偶然的,而不是谨慎的选择;-)

根据代码的工作方式,可以尝试使用slots。当您尝试分配不在插槽中的内容时,会抛出AttributeError异常,这将使这种键入更加明显。在

你试过静态分析工具吗?Here is a great thread about them.

相关问题 更多 >