【问题标题】:Variable definition belonging to a Class属于一个类的变量定义
【发布时间】:2019-12-08 21:59:07
【问题描述】:

我刚开始学习python(来自C);我发现自己对定义属于一个类的变量的方式感到非常困惑(不管是“类类型”还是“实例类型”,我的问题更基本)。 到目前为止,我已经尝试过这些代码行:

class A:
  pass

A.a = 1
A.b = 2
print(A.a+A.b)

这段代码出人意料地返回了“3”(虽然我预计会出错),这导致我来到这里。 我不明白为什么解释器能够推断出属于“A”类的变量(我从未定义过)。

【问题讨论】:

  • 你确实定义了它们。通过执行A.a = 1,您现在创建了A 类的属性a。这是可能的,因为用户定义的类带有__dict__,它保存了属性的映射。例如尝试做object().a = 1 看看会发生什么
  • 您的困惑源于您没有在class 语句中首先声明属性,但Python没有拥有变量声明,只有定义。
  • @chepner 我同意,我现在患有斯德哥尔摩综合症到 C...
  • @Guillermo.D.S. - 我不确定它是否会消失,C 是一个非常好的捕捉者
  • 我会注意到,虽然您可以随时为(大多数)对象添加属性,但您应该避免这样做.在class 语句本身中初始化expected 类属性,并在类的__init__ 方法中初始化预期实例属性。您可以在以后使用直接访问更改其中任何一个的值,但不要以这种方式添加新属性。

标签: python


【解决方案1】:

从 C 的角度来看,假设 Python 属性存储在哈希表中,因此可以在运行时动态修改和查询。

考虑一下:

class A:
    pass

print(A.__dict__)
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

当您修改A 时,您正在修改它的__dict__ member

A.a = 1

print(A.__dict__)
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, 'a': 1}

注意它现在如何包含a

print(A.__dict__['a'])
1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2019-08-05
    相关资源
    最近更新 更多