相关疑难解决方法(0)

为什么类__dict__是mappingproxy?

我想知道为什么一个类__dict__是一个类mappingproxy,但实例__dict__只是一个简单的例子dict

>>> class A:
...     pass

>>> a = A()
>>> type(a.__dict__)
<class 'dict'>
>>> type(A.__dict__)
<class 'mappingproxy'>
Run Code Online (Sandbox Code Playgroud)

python class python-3.x python-internals

60
推荐指数
3
解决办法
8491
查看次数

Python:解释__dict__属性

好吧,我对__dict__属性感到很困惑.我搜索了很多,但我仍然不确定输出.在对象或类或函数中使用的情况下,是否可以解释从零开始使用此属性?谢谢你的每一件衣服

python

45
推荐指数
3
解决办法
8万
查看次数

内置类型和用户定义的不一致

在阅读关于类型统一的内容时,我偶然发现内置类型有method_descriptors和builtin_function_or_methods而不是methods和functions,为什么呢?

>>> list.append
<method 'append' of 'list' objects>
>>> type(list.append)
<class 'method_descriptor'>
>>> [].append
<built-in method append of list object at 0x7f0c4214aef0>
>>> type([].append)
<class 'builtin_function_or_method'>
>>> class A(list):
...   def append(self): pass
... 
>>> A.append
<function A.append at 0x7f0c42168dd0>
>>> type(A.append)
<class 'function'>
>>> A().append
<bound method A.append of []>
>>> type(A().append)
<class 'method'>
Run Code Online (Sandbox Code Playgroud)

没有充分的理由class A将子列表子类化,我只是想表明类型不同.

python types

5
推荐指数
1
解决办法
117
查看次数

如何在没有 __dict__ 的情况下创建类对象

class B(type):
    __slots__ = ()

class A(metaclass=B):
    pass

A.test = "test"
Run Code Online (Sandbox Code Playgroud)

"A"是元类的实例"B""B"__slots__定义 - 为什么我__dict__在课堂上A?我如何在没有__dict__?

python class python-3.x

5
推荐指数
1
解决办法
1369
查看次数

__dict__ 终极基类的属性,Python 中的对象

以下代码按排序顺序列出了名为“A”的类的属性:-

>>> class A():
        def __init__(self, i):
            self.at = i

>>> sorted(vars(A))
['__dict__', '__doc__', '__init__', '__module__', '__weakref__']
Run Code Online (Sandbox Code Playgroud)

现在,打印键的值,'__dict__'结果如下:-

>>> vars(A)['__dict__']                 #Value of '__dict__'
<attribute '__dict__' of 'A' objects>
Run Code Online (Sandbox Code Playgroud)

根据文档, vars([object])

返回具有__dict__属性的模块、类、实例或任何其他对象的__dict__属性。


我不明白的是,'__dict__'列表中的属性是用于vars()返回属性的相同属性A还是具有其他目标的不同属性,例如按照建议(根据我的说法)实现 A 的对象命名空间的值其中成立。'__dict__'


编辑:-

问题的第一部分与另一个问题(也由@eliotness 提到)非常相关,但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改标题题。


让我们考虑另一个在 Python 中生成最终基类属性列表的代码object:-

>>> sorted(vars(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', ...., '__str__', '__subclasshook__']
>>> hasattr(object, '__dict__')
True …
Run Code Online (Sandbox Code Playgroud)

python dictionary magic-methods

5
推荐指数
1
解决办法
496
查看次数

如何在覆盖其类上的 __dict__ 属性后访问实例字典?

考虑这个例子,其中__dict__类的所有实例的 都A将指向全局 dict shared

shared = {'a': 1, 'b': 2}

class A(object):
    def __init__(self):
        self.__dict__ = shared
Run Code Online (Sandbox Code Playgroud)

现在让我们测试一些事情:

>>> a = A()
>>> b = A()
>>> a.a, a.b, b.a, b.b
(1, 2, 1, 2)
>>> b.x = 100
>>> shared
{'a': 1, 'x': 100, 'b': 2}
>>> a.x
100
>>> c = A()
>>> c.a, c.b, c.x
(1, 2, 100)
>>> shared['foo'] = 'bar'
>>> a.foo, b.foo, c.foo
('bar', 'bar', 'bar')
>>> a.__dict__, b.__dict__, …
Run Code Online (Sandbox Code Playgroud)

python class python-internals

1
推荐指数
1
解决办法
1056
查看次数

Python的"类是一个字典"理论和添加类变量的后果

出于好奇,我正在使用__dict__Python类的属性.

我在某处读到python中的"类"是一种字典,并且调用__dict__类实例将实例转换为字典......我认为"很酷!我可以使用它!"

但这让我怀疑这些行为的正确性和安全性.

例如,如果我这样做:

class fooclass(object):
    def __init__(self, arg):
        self.arg1 = arg

p = fooclass('value1')
print(p.__dict__)
p.__dict__['arg2'] = 'value2'
print(p.__dict__)
print(p.arg2)
Run Code Online (Sandbox Code Playgroud)

我有这个:

>>>{'arg1': 'value1'}
>>>{'arg1': 'value1', 'arg2': 'value2'}
>>>value2
Run Code Online (Sandbox Code Playgroud)

那没关系,但是:

  1. 是否fooclass还有1个属性?我怎么能确定?
  2. 以这种方式添加属性是否安全?
  3. 你曾经有过这个派上用场的案例吗?
  4. 我看到我不能这样做fooclass.__dict__['arg2'] = 'value2'...为什么一个类和一个实例之间存在这种差异?

python dictionary class

-2
推荐指数
1
解决办法
84
查看次数