- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
属性 __dict__
应该包含用户定义的属性。但是如果我们打印一个空类的 __dict__
,我也会得到:
__module__
__dict__
__weakref__
__doc__
Python 根据类对象类型在 __dict__
属性中预填充。
现在,__base__
和 __class__
也是 Python 定义的类对象类型的属性,但不包含在 __dict__
中。
是否有任何规则指定对象 __dict__
中包含哪些 dunder 属性,哪些不包含?
最佳答案
The attribute
__dict__
is supposed to contain user defined attributes.
不,__dict__
包含对象的动态属性。然而,对象的类型并不是唯一可以具有的属性,通常也会引用对象的类型来查找属性。
例如,类的方法也可以作为实例的属性找到。许多这样的属性是 descriptor objects并且在查找时绑定(bind)到对象。这是 __getattribute__
方法的工作,所有类都继承自 object
;对象的属性通过 type(object).__getattribute__(attribute_name)
解析,此时类型的描述符以及直接在对象上设置的属性(在 __dict__
映射)被考虑。
类的__bases__
属性由类元类型提供,默认为type()
;它是一个描述符:
>>> class Foo:
... pass
...
>>> Foo.__bases__
(<class 'object'>,)
>>> type.__dict__['__bases__']
<attribute '__bases__' of 'type' objects>
>>> type.__dict__['__bases__'].__get__(Foo, type)
(<class 'object'>,)
__dict__
恰好是存储可以具有任何有效字符串名称的属性的地方。对于包含在创建类时设置的几个标准属性的类(__module__
和 __doc__
),以及其他作为类实例的描述符的类(__dict__
和 __weakref__
)。后者必须添加到 类,因为类本身也有那些属性,取自 type
,再次作为描述符。
那么为什么 __bases__
是描述符,而 __doc__
不是呢?您不能将 __bases__
设置为任何值,因此描述符 setter 会检查特定条件并提供重建内部缓存的机会。 Python 核心开发人员使用描述符来限制可以设置的内容,或者在设置值时需要额外的工作(例如验证和更新内部结构)。
关于 python __dict__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48029249/
代码先行: class A(object): def foo(self): self.foo = 'foo' def bar(self): self.b
请看下面的片段: class Foo: class_var = "hi" foo = Foo() assert foo.class_var is Foo.class_var assert "c
>>> class A(object): pass ... >>> A.__dict__ >>> A.__dict__.__dict__ Traceback (most recent call la
如果我在 Python 解释器中运行以下代码: >>> object.__dict__ is object.__dict__ False 为什么结果是 False? 最佳答案 object.__dic
我感兴趣的是是否有一种方法可以可靠地内省(introspection) Python 实例以查看它的 __dict__ 尽管程序员可能会在途中抛出任何障碍,因为这将帮助我调试问题,例如意外的引用循环和
属性 __dict__ 应该包含用户定义的属性。但是如果我们打印一个空类的 __dict__,我也会得到: __module__ __dict__ __weakref__ __doc__ Python
我知道函数对象有一个 __dict__ .这很少用于向函数添加属性。有些人甚至用它来为函数添加注释。 我的疑问如下。如果有: def foo(): a = 2 return 在哪里 “一个
我对 dict 进行子类化,以便属性与键相同: class DictWithAttr(dict): def __init__(self, *args, **kwargs): s
我有一个字典,它的大小是 198526。 sys.getsizeof(dic)) # 198526 class Actor(object): def __init__(self):
给定一个任意类 X 作为输入,是否有可能找出 X 的实例是否有一个 __dict__? 我尝试了 hasattr(X, '__dict__'),但这不起作用,因为它检查类对象是否具有 __dict__
我需要定义一个名为“class”的类变量。我想直接在类命名空间中执行此操作,而不是在类方法中。显然,我不能直接说: class MyClass(object): a = 1 b = 2
这个问题在这里已经有了答案: Python class instance __dict__ doesn't contain all instance variables. Why? (3 个答案)
我试图直接使用 X.__dict__['x'] += 1 之类的东西修改类 __dict__ 中的值。那样修改是不可能的,因为类__dict__实际上是一个mappingproxy对象,不允许直接修改
我正在测试预定义的 字典 一个函数的属性,我得到了一个我没想到的结果。考虑以下代码: >>> def func(): x = 7 a = 0 print(fu
为什么这有效: class Bunch(dict): def __init__(self, *args, **kwargs): super(Bunch, self).__ini
代码在前, #Python 2.7 >>>class A(object): pass >>>a1 = A() >>>a2 = A() >>>A.__dict__ dict_proxy({
这个问题在这里已经有了答案: How do you programmatically set an attribute? (5 个答案) 关闭 6 年前。 我被告知我应该避免在我的代码中使用 sel
考虑这个例子,其中一个类 A 的所有实例的 __dict__ 将指向一个全局字典 shared。 shared = {'a': 1, 'b': 2} class A(object): def
有没有理由不这样做来比较两个对象: def __eq__(self, other): return self.__dict__ == other.__dict__ 与检查每个单独的属性相反:
我试图理解 python 中的束模式,我相信可以用以下方式表达: class Bunch: def __init__(self, **kwds): self.__dict__.
我是一名优秀的程序员,十分优秀!