当前位置: 首页 > 知识库问答 >
问题:

类变量在python中找不到__dict__

范侯林
2023-03-14

有一个代码:

class C():
    a=1
    def f(self):
        print "f func"

a=C()
print a.a
a.f()
>>> 1
>>> f func

当我试图获取a.__dict__vars(a)时,它只显示{}。但是

a.b=123
print a.__dict__
>>> {'b': 123}

我不明白,为什么会这样。

共有2个答案

邵昆琦
2023-03-14
>>> C.a
1
>>> vars(C)['a']
1

(一个类的整个vars字典相当长。)

就像你的标题说的,它是一个类变量。它属于类,而不是对象。Python在幕后执行一些特殊的逻辑,以便在调用a. a时查看类型对象。我不是专家,但我怀疑它找到a的方式与找到方法的方式相同。在Java等语言中,我认为这种用法是不被鼓励的。我不知道在Python中是否不鼓励。

金飞
2023-03-14

查看a.。\uuuu dict\uuuuvars(a)为您提供a的属性,这是一个实例。该实例最初没有自己的属性。在类定义中创建的属性a是类本身的属性,而不是其实例的属性。稍后当您执行a.b=123时,您将仅在实例上创建一个属性,以便可以在实例\uuuu dict\uuuu中看到它。如果查看C.\uuu dict\uuu,您将看到属性a

当您打印a.a时,Python会在类C上动态查找属性a。它看到实例没有属性a,因此它查看类并在那里找到一个属性。这是打印的值。创建实例时不会将class属性“复制”到实例中;相反,每次尝试读取instance属性时,Python都会检查它是否存在于实例中,如果不存在,它会在类中查找它。

 类似资料:
  • 我正在尝试将另一个类的布尔变量调用到包含数组列表的类。下面方法的目的是将学生添加到团队中,如果学生不到一定年龄(例如18岁),他们将获得折扣。 以下是学生是否是大三学生的布尔结果代码: arraylist类包含一个方法sighUp(),该方法将学生添加到团队列表中。如果学生是大三学生,他们可以享受折扣: 我一直得到的错误是“isJunior”是一个找不到的变量。我试图从包含布尔变量的学生类中调用此

  • 问题内容: 我想在詹金斯中设置很多变量。我试图把他们的,和该的用户,但是当构建正在发生詹金斯无法找到他们。 唯一可行的方法是将所有env变量放入其中,如下所示: 但是我不认为这是个好方法。 在詹金斯中设置环境变量的正确方法是什么? 问题答案: 在我看来,这很正常。并且应被视为文本凭据,您可以使用 指令添加环境变量。 如果你需要保持环境变量分开,你可以创建一个包含所有的常规文件,然后将该文件加载到使

  • 问题内容: 在Java中,可以使用或在变量上查找其类型。 如何在JavaScript中找出不是强类型的变量类型? 例如,如何知道a是a 还是a 或a ? 问题答案: 用途: 因此,您可以执行以下操作: 但是,如果用它们的对象包装定义了这些原语,则要小心(永远不要这样做,请尽可能使用文字): 数组的类型为still 。在这里,您确实需要操作员。 更新: 另一种有趣的方式是检查以下内容的输出: 这样,

  • 问题内容: 我试图在我的react- native应用程序中使用节点模块,并且在这里采用ReactNativify方法。 我现在已经全部设置好了,我可以很好地加载加密包了。但是,当我添加eth- lightwallet时, 事情变得很奇怪。 自从我在其中添加该软件包以来,npm一直没有安装任何依赖项。意味着我必须手动添加它们。每次我安装某种与eth- lightwallet相关的依赖项时,都会卸载

  • 问题内容: 我有一个关于在Grunt上使用茉莉花的问题。我不断出错 ReferenceError:找不到变量:require at 每当我运行茉莉花测试时。这是我的Gruntfile.js的茉莉花条目: 我可以在没有需求的情况下运行虚拟测试,但是像这样在测试中包含需求时,会出现需求错误。 问题答案: 我有同样的问题。只需安装此节点软件包并将此行添加到您的Gruntfile中,require应该重新