为什么Python允许在初始化后添加实例变量?

时间:2016-01-11 21:03:43

标签: python instance-variables

class MyClass(object):
    class_var = []
    def __init__(self, i_var):
        self.i_var = i_var

a = MyClass(2)
a.hit = 1
print a.hit

正如我们所看到的,hit在初始化后作为实例变量添加到a。 允许以这种方式定义实例变量的理由是什么?而且,这有危险吗?

3 个答案:

答案 0 :(得分:4)

  

允许以这种方式定义实例变量的理由是什么?

我认为重要的是要注意self函数中的__init__与该实例上任何其他方法中的self完全相同。它也与课外的a相同。 __init__方法的神奇之处在于被调用时,没有别的(所有 python魔术方法都是如此)。让__init__以某种方式“冻结”对象将违背在python中总是完成的事情。

所以,我会说“好理由”是因为它使事情非常一致。

  

而且,这有危险吗?

是。它可以。

故意向实例添加方法/属性的做法被称为Monkey Patching(有时也称为Duck Punching) 1 - 它实际上不应该是除非你没有任何其他选择。

无意中向实例添加方法/属性的做法被称为创建错误(我们都已经完成了它: - )。

幸运的是,有一些工具可以帮助您防止这些类型的错误。 Linters是最常见的。我个人使用pylint来帮助警告我这些错误。

在linter和使用常识之间(见上文关于不是Monkey Patching),由于python的这一部分意识形态,我很少遇到难以追踪的bug。

1 我认为如果你在后面的实例方法中添加更多属性,那就不是鸭子冲击 - 但你可能也不应该这样做。 。

答案 1 :(得分:2)

没有好的答案,为什么?"题。这是蟒蛇意识形态的一部分。 Python结合了来自几种不同编程范例的元素,以适应不同的编码风格。您可以编写功能性,纯面向对象,结构化(如果您已经老了但不是很亮),甚至可以编写事件驱动,如果您想要更加精美和异步。它本身并不危险,但与许多其他语言细节一样,它确实允许你在众所周知的脚下射击自己(可能还有你的开发团队的其他成员)。

答案 2 :(得分:1)

我认为这与蟒蛇原则一致,即“我们都是负责任的用户”。见这里:http://docs.python-guide.org/en/latest/writing/style/