为什么允许我们在Python中动态地向类添加属性?

时间:2019-02-12 15:27:54

标签: python python-3.x oop encapsulation class-attributes

Python中,我们可以动态地向对象(类)添加属性,例如:

class Foo(object):
    pass

foo = Foo()
foo.a = 10

我的问题可能有点理论化。 所以,这很方便。但是为什么,我们应该使用该功能吗???有什么特殊情况可以采用这种方法?封装呢?

2 个答案:

答案 0 :(得分:5)

一句话:灵活性。作为一个示例,当需要将带有GUI对象的数据传递给一种方法来处理附加到它们的事件时,我就使用了动态属性。我确定还有很多其他用途。

也就是说,如果您是喜欢强制属性并且不允许动态添加新属性的人,那么您可以这样做。我可以想象出一些有用的地方,例如,帮助确保您未在​​代码中设置错误的值(典型)。自我检查的东西。

为了限制/阻止动态值的添加,您可以向该类添加__slots__属性,如下所示。

class Foo(object):
    __slots__ = ['val', 'val2']
    pass

foo = Foo()
foo.val = 10

print(foo.val)

foo.b = 5 # throws exception
print(foo.b) 

答案 1 :(得分:3)

根据https://rosettacode.org/wiki/Add_a_variable_to_a_class_instance_at_runtime

当实例的方法/变量基于直到运行时才可用的数据文件时,这很有用。哈尔·富尔顿(Hal Fulton)提供了一个在使用Ruby进行元编程的练习中创建OO CSV解析器的示例。这被Pythonistas和其他一些人称为“ monkeypatching”。

当我第一次尝试在所有数据库中都可以使用的大数据算法时,我使用了此功能,您不知道每个表的属性,但是您不必知道,我想就是这样