当前位置: 首页 > 面试题库 >

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

左华灿
2023-03-14
问题内容

我正在研究python,尽管我认为我了解了Python的全部概念和概念,但今天我偶然发现了一段我不完全理解的代码:

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

class Circle():
    pass

由于我尚未定义任何属性,因此该如何做:

my_circle = Circle()
my_circle.radius = 12

奇怪的是,Python接受上述声明。我不明白为什么Python不会引发undefined name error。我确实知道,通过 动态类型化,
我只是在需要时将变量绑定到对象,但是类中不应该radius存在Circle允许我执行此操作的属性吗?

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


问题答案:

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

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

如果您想要一个安全网,那就太糟糕了。Python没有提供一种语言,您不能合理地添加一种语言,最重要的是,使用该语言的Python程序员会避免使用它(阅读:几乎所有您想使用的语言)。测试和纪律,对于确保正确性还有很长的路要走。__init__
如果可以避免
,请不要使用自由来补充属性,而要进行自动化测试。我很少会AttributeError因为这样的诡计而出现逻辑错误,在发生的那些错误中,几乎所有错误都会被测试捕获。



 类似资料:
  • 问题内容: 我已经开始学习用于Android应用程序开发的Java语言。 根据我对静态类的理解,我们无法实例化静态类的对象。 但是,为什么在随后的情况下允许实例化静态嵌套类对象? 如果将内部类的对象标记为静态,为什么我们可以创建它呢? 问题答案: 根据我对静态类的理解,我们无法实例化静态类的对象。 您对“静态类”的含义的理解不正确。基本上, Java中 的“静态类” 是嵌套类,它没有对包含类的实例

  • 但是为什么在下面的情景中允许静态嵌套类对象的实例化呢? 为什么我们可以创建内部类的对象,如果它被标记为静态的?

  • 问题内容: (用Python shell编写) 为什么不允许对象向其添加属性? 问题答案: 请注意,实例没有属性: 一个在派生类中说明此行为的示例: 引用以下文档: […]声明采用一系列实例变量,并在每个实例中仅保留足够的空间来为每个变量保存一个值。因为未为每个实例创建空间,所以节省了空间。 编辑:要从评论中回答ThomasH,OP的测试类是“旧式”类。尝试: 您会注意到有一个实例。对象类可能没有

  • 在C++98中,以下代码无法编译,因为ifstream没有复制构造函数: 但是,在C++11中使用多个GCC版本时,编译时不会出现警告。这是什么原因?

  • 问题内容: 这件事困扰了我一段时间。我为什么不能做: …虽然我可以执行以下操作? 这是什么规则?您能给我介绍一下吗? 问题答案: 您可以向具有的任何对象添加属性。 例如,没有它。 字符串和其他简单的内置对象也没有它。 使用类也没有它。 除非前面的声明适用,否则用定义的类都具有它。 如果使用/的对象没有/ ,通常是为了节省空间。例如,如果有一个命令,那就太过分了- 想象一下一个非常短的字符串的膨胀程

  • 问题内容: 在JPA 2.0规范 说,第22页: 类的实例变量必须是私有的,受保护的或程序包可见性,而与使用字段访问还是属性访问无关。使用属性访问时,属性访问器方法必须是公共的或受保护的。 为什么不允许公共访问? 问题答案: 对于公共字段,将没有办法使代理可靠地工作-如果有人直接访问字段,那么持久性框架就没有简单的方法来拦截该调用并(例如)初始化包含对象(如果它是代理) 。 如果无法进行字段访问,