Skip to main content
 首页 » 编程设计

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

2025年05月04日13mayingbao

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中。 允许以这种方式定义实例变量的充分理由是什么?而且,它危险吗?

请您参考如下方法:

What's a good reason to allow defining instance variable in such a way?

我认为重要的是要注意 __init__ 函数中的 self 与该实例的任何其他方法中的 self 完全相同。也和类外的a一样。 __init__ 方法的魔力在于它被调用的时间,而不是其他(所有 python 魔法方法都是如此)。让 __init__ 以一种或另一种方式“卡住”对象将违背 python 中一直做事的方式。

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

And, is it dangerous?

是的。可以。

有意向实例添加方法/属性的做法被称为 Monkey Patching(有时也称为 Duck Punching)1 -- 这真的不应该完成,除非您没有任何其他选择。

无意中向实例添加方法/属性的做法被称为制造错误(我们都这样做过:-)。

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

在 linter 和使用常识之间(参见上面关于非 Monkey Patching 的内容),由于 python 的这一部分意识形态,我很少遇到难以跟踪的错误。

1我想,如果您在后面的实例方法中添加更多属性,那不是鸭子打法——但您可能也不应该这样做。 . .