python - 为什么 __slots__ 不是 Python 中的默认值?

标签 python attributes python-internals

我已经用 Python 编程很长时间了,但我仍然不明白为什么类默认基于 __dict__ 字典而不是更快的 __slots__ 元组。

使用更高效且不太灵活的 __slots__ 方法作为默认实现,而将更灵活但更慢的 __dict__ 方法作为可选方法不是更有意义吗?

此外,如果一个类使用 __slots__ 来存储其属性,则不会错误地创建如下新属性:

class Object:
    __slots__ = ("name",)
    def __init__(self, name):
        self.name = name

obj = Object()
# Note the typo here
obj.namr = "Karen"

所以,我想知道 Python 默认通过 __dict__ 而不是通过 __slots__ 访问实例属性是否有正当理由。

最佳答案

Python 被设计为一种极其灵活的语言,并允许对象在运行时以许多有趣的方式修改自身。进行更改以防止这种灵活性会破坏大量其他人的代码,因此为了向后兼容,我认为这种情况不会很快发生(如果有的话)。

除此之外,由于 Python 代码的解释方式,设计一个可以预见并提前准确确定特定类将使用哪些变量的系统非常困难,特别是考虑到setattr()的存在”以及其他类似的函数,它们可以以不可预测的方式修改其他对象的状态。

总而言之,Python 的设计注重灵活性而非性能,因此,如果您希望编写自己的代码,那么将__slots__作为加速部分代码的可选技术是您选择做出的权衡。 Python 代码。我无法回答这对您来说是否是一个值得的设计决定,因为它完全基于意见。

如果您希望更安全地防止出现您所描述的问题,可以使用mypypylint等工具来捕获此类错误。

关于python - 为什么 __slots__ 不是 Python 中的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73265618/

相关文章:

python - python类初始值设定项中的可选参数

python - 完成特定任务后暂停线程的条件变量(在 Python 中)

python - 使用 __contains__ 对 numpy 数组进行非常缓慢的迭代

C# 允许派生类的多个属性

java - 有没有办法在 servlet session 中创建 "one time use"属性?

ruby-on-rails - Rails - 无法批量分配 protected 属性

python - 为什么元组可以包含可变项?

python - 将带有注释的签名添加到扩展方法

python - 在 Python 中使用 Bash 仅获取 IP 地址

python - 如何使用子类的默认值调用父类init?