gpt4 book ai didi

python - 为什么允许向已经实例化的对象添加属性?

转载 作者:IT老高 更新时间:2023-10-28 20:26:54 26 4
gpt4 key购买 nike

我正在学习python,虽然我认为我了解了Python的整个概念和概念,但今天我偶然发现了一段我没有完全理解的代码:

假设我有一个应该定义 Circles 但缺少主体的类:

class Circle():
pass

由于我没有定义任何属性,我该怎么做:

my_circle = Circle()
my_circle.radius = 12

奇怪的是 Python 接受了上述声明。我不明白为什么 Python 不会引发 undefined name error。我确实明白,通过 动态类型 我只是在需要时将变量绑定(bind)到对象,但 Circle 类中不应该存在属性 radius允许我这样做吗?

编辑:你的答案中有很多精彩的信息! 感谢大家提供的所有精彩答案!很遗憾,我只能将其中一个标记为答案。

最佳答案

一个主要原则是没有声明这样的东西。也就是说,你永远不会声明“这个类有一个方法 foo”或“这个类的实例有一个属性 bar”,更不用说声明要存储在那里的对象的类型了。您只需定义一个方法、属性、类等,它就会被添加。正如 JBernardo 所指出的,任何 __init__ 方法都做同样的事情。将新属性的创建任意限制为名称为 __init__ 的方法没有多大意义。有时将函数存储为实际上没有该名称的 __init__ (例如装饰器)很有用,这样的限制会破坏这一点。

现在,这并非普遍适用。内置类型省略了此功能作为优化。通过__slots__ ,您也可以在用户定义的类上防止这种情况。但这只是空间优化(不需要每个对象都有字典),而不是正确性。

如果你想要一个安全网,那就太糟糕了。 Python 没有提供一个,而且你不能合理地添加一个,最重要的是,拥抱该语言的 Python 程序员会避开它(阅读:几乎所有你想与之合作的人)。测试和纪律,对于确保正确性还有很长的路要走。不要随意在__init__ 如果可以避免之外的属性,做自动化测试。由于像这样的诡计,我很少遇到 AttributeError 或逻辑错误,而在这些发生的情况中,几乎都被测试捕获了。

关于python - 为什么允许向已经实例化的对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12569018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com