我知道__dict__ inobj.__dict__是 的描述符属性type(obj),因此查找obj.__dict__是type(obj).__dict__['__dict__'].__get__(obj)。
很容易说它
__dict__必须是一个描述符,因为__dict__将它实现为条目将需要您先找到 ,__dict__然后才能找到__dict__,但是在查找其他属性时,Python 已经绕过了正常的属性查找来查找__dict__,因此这并不像它最初听起来。如果描述符被替换为 each 中的一个'__dict__'键__dict__,__dict__仍然可以找到。
“Python 已经绕过正常的属性查找来查找__dict__”如何?“正常属性查找”是什么意思?
根据链接中引用的上下文,我不认为作者在撰写该内容时提到了查找obj.__dict__是type(obj).__dict__['__dict__'].__get__(obj).
在下面,我可以看到在 python 中添加一个整数时,它添加了整数,将该结果值分配给一个新的内存地址,然后将变量设置为指向该内存地址:
>>> a=100
>>> id(a)
4304852448
>>> a+=5
>>> id(a)
4304852608
Run Code Online (Sandbox Code Playgroud)
有没有办法查看(旧)内存地址 4304852448 (0x10096d5e0) 处的值是多少?例如:value_of(0x10096d5e0)
我正在探索读取格式化二进制文件的方法,并从基础开始:
>>> with open(fp, 'rb') as f:
buffer = f.read()
Run Code Online (Sandbox Code Playgroud)
我的文件是 1.02GB,第一次读取它并存储在内存中需要大约 90 秒。偶然地,我不小心告诉解释器再次读取文件(按 Enter 太多次),它在 0.5 秒内读取了它。该文件在无意中重新阅读之前已关闭。
这里发生了什么?
在Python中,文档__class__被描述为属性.在对象type(元类)中,__class__似乎是一种方法.
如果我们这样做:
>>> class Foo:
pass
>>> a = Foo()
>>> a.__class__ == type.__class__(a)
True
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:
a.__class__,我们真的在调用这个方法type.__class__(a)吗?__class__是不是__dict__属性成员的原因a吗?当我遇到len函数的C实现时,我正在阅读有关python内置函数的实现的信息。
static PyObject *
builtin_len(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
{
Py_ssize_t res;
res = PyObject_Size(obj);
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
return PyLong_FromSsize_t(res);
Run Code Online (Sandbox Code Playgroud)
我无法理解这段代码中发生了什么。我不知道C是如何工作的。有人可以解释这段代码在做什么吗?
我从https://github.com/python/cpython/blob/master/Python/bltinmodule.c获取了代码
编辑:我只是很好奇len函数是如此之快,在这段代码中绊倒了。我只想知道为什么使用函数PyObject_Size检查对象的大小为零,然后使用PyLong_FromSsize_t返回实际大小。
python ×5
cpython ×2
python-3.x ×2
attributes ×1
c ×1
descriptor ×1
io ×1
object-model ×1
types ×1