问题标签 [python-datamodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 对于充当无限序列的对象,__len__ 的正确返回值
我正在编写一个 python 类,它充当不可变的无限序列。
该类不使用生成器来访问这个无限序列,而是根据方法中的算法为序列中的任意索引生成一个值__getitem__
。
我很好奇处理__len__
这种对象的方法的最佳方法是什么。理想情况下,我会float("inf")
通过__len__
. 但是,在后台len()
调用对象方法的函数需要一个特定的值。__len__
如果__len__
设置为返回 float("inf") 或 decimal.Decimal("Infinity"),len()
则通过引发 TypeError 来拒绝它。它还拒绝“-1”的值,这意味着序列是无限的。此外,当我尝试使用我之前编写的实际上确实继承自的无穷大类时int
,len()
无论出于何种原因返回 0。
虽然允许值只是“0”并不是一个主要的不便,虽然这样的类非常不寻常,但我仍然很想知道,有没有一种处理类的长度属性的好方法那是一个无限序列?
python - 未实现的 __init__()
我正在查看一些带有拼写错误的__init__()
函数的代码(它总共有 3 个下划线而不是 4 个)。我意识到当一个对象找不到合适的__init__()
.
是否有自动插入的默认初始化程序?有没有__new__
被调用的默认值?为什么带参数的构造函数会失败?
python - 为什么 Counter 的 __init__ 方法称为描述符?
我正在阅读 Counter 类的 __init__ 方法,看到了这个:
我不确定描述符是什么意思,所以我检查了python数据模型文档,发现了这个:
通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法覆盖:__get__()、__set__() 和 __delete__()。如果为对象定义了这些方法中的任何一个,则称其为描述符。
这些方法似乎都不存在于类定义中,那么为什么将 __init_ 称为描述符?
python - Schrödinger's variable: the __class__ cell magically appears if you're checking for its presence?
There's a surprise here:
It seems like the mere mention of __class__
is explicitly checked by the parser? Otherwise we should get something like
Indeed, if you modify to only check the key instead, i.e. check for '__class__' in locals()
, then we only have self
in scope as expected.
How does it happen that this variable gets magically injected into scope? My guess is this is something to do with super
- but I didn't use super
, so why does the compiler create an implicit closure reference here if it isn't needed?
python - Python - 类 __hash__ 方法和集合
我正在使用类set()
的__hash__
方法python
来防止在集合中添加相同的哈希对象。根据python 数据模型文档,set()
将相同的哈希对象视为相同的对象,只需添加一次。
但它的行为不同如下:
在字符串值的情况下,它可以正常工作。
我的问题是:为什么相同的哈希对象在集合中不一样?
python - Python 世界中的预创建值
据我所知(如果我错了,请纠正我)Python解释器在启动时创建了一些值。
有没有办法找出这些值是什么?
python - 如何在子类上“取消定义”Python 魔术方法?
Python 3 中是否有办法指示一个类不支持其父类支持的某些操作?* 我知道类可以设置__hash__
为None
指示一个类型是不可散列的,但这似乎并不普遍。
例如,假设我有一个带有__len__
方法的集合类,并且我想创建一个子类来表示一个没有定义大小的无界集合。如果我在子类中设置__len__
为None
,当我尝试获取集合的长度时,我会收到一条丑陋/令人困惑的错误消息。
我想得到一个错误,好像D
根本没有定义__len__
:
这个问题是相关的,但是我的问题专门与魔术方法/运算符重载有关。由于直接在对象的类型上查找 Python 魔术方法,因此某些可能的方法(如覆盖__getattribute__
或使用描述符)在这里不起作用。
*注意:我知道这会违反Liskov 替换原则,但如果我想要类型安全,我一开始就不会使用 Python。;)