type.__setattr__ 与 object.__setattr__ 有什么不同?

2024-03-21

type.__setattr__用于类,基本上是元类的实例。object.__setattr__另一方面,用于类的实例。这是完全可以理解的。

我没有看到这两种方法之间有显着差异,至少在Python级别,我注意到这两种方法使用相同的属性分配过程,如果我错了,请纠正我:

Suppose a是一个用户定义类的实例,只是一个普通类:

class A:
    pass

a = A()
a.x = ...

then a.x = ..调用type(a).__setattr__(...)它执行以下步骤:

Note: type(a).__setattr__会发现__setattr__ in object内置类

1) 查找数据描述符type(a).__mro__.

2) 如果找到数据描述符,则调用它的__set__方法并退出。

3) 如果没有找到数据描述符type(a).__mro__,然后添加属性a.__dict__, a.__dict__['x'] = ...


对于类——元类的实例,过程是类似的:

class A(metaclass=type):
    pass

then: A.x = ...被翻译成type(A).__setattr__(...)它执行以下步骤:

Note: type(A).__setattr__会发现__setattr__ in type内置类

1) 查找数据描述符type(A).__mro__

2) 如果找到数据描述符,则调用它的__set__方法并退出。

3) 如果没有找到数据描述符type(A).__mro__,然后添加属性A.__dict__, a.__dict__['x'] = ...

But object.__setattr__不适用于课程:

>>> object.__setattr__(A, 'x', ...)
TypeError: can't apply this __setattr__ to type object

反之亦然,type.__setattr__不适用于以下实例A:

>>> type.__setattr__(A(), 'x', ...)
TypeError: descriptor '__setattr__' requires a 'type' object but received a 'A'

嗯!这两种方法之间一定有什么不同。这虽然很微妙,但却是事实!

大概这两种方法内部执行相同的步骤__setattr__,有什么区别type.__setattr__ and object.__setattr__以便type.__setattr__仅限于班级和object.__setattr__仅限于类的实例?


type.__setattr__有一个检查以防止在类型上设置属性,例如int,并且它会执行一系列普通对象不需要的不可见清理。


让我们来看看幕后花絮吧!这是type.__setattr__ https://github.com/python/cpython/blob/3.6/Objects/typeobject.c#L3075:

static int
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
{
    if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
        PyErr_Format(
            PyExc_TypeError,
            "can't set attributes of built-in/extension type '%s'",
            type->tp_name);
        return -1;
    }
    if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
        return -1;
    return update_slot(type, name);
}

如果我们检查PyBaseObject_Type https://github.com/python/cpython/blob/3.6/Objects/typeobject.c#L4508,我们看到它使用PyObject_GenericSetAttr为其__setattr__,中途出现的相同调用type_setattro.

Thus, type.__setattr__就好像object.__setattr__,但还进行了一些额外的处理。

首先,if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))check 禁止对用 C 编写的类型进行属性赋值,例如int or numpy.array,因为为这些属性分配属性可能会以不熟悉 C API 的人意想不到的方式严重破坏 Python 内部结构。

其次,之后PyObject_GenericSetAttr调用更新类型的字典或从元类调用适当的描述符,update_slot修复任何slots受属性分配的影响。这些槽是 C 级函数指针,用于实现实例分配等功能,in检查,+、释放等。大多数都有相应的Python级别的方法,比如__contains__ or __add__,如果重新分配其中一个 Python 级方法,则相应的槽(或多个槽)也必须更新。update_slot它还更新该类的所有后代上的槽,并且它使用于类型对象属性的内部属性缓存中的条目无效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

type.__setattr__ 与 object.__setattr__ 有什么不同? 的相关文章

  • 使用 PIP 从 Github 安装 Python 包

    我已经看到文档表明您可以通过以下方式使用 pip 安装托管 Python 包的 Github sudo pip install e git git github com myuser myproject git egg myproject
  • 这段代码中list[:]的含义是什么? [复制]

    这个问题在这里已经有答案了 这段代码来自Python的文档 我有点困惑 words cat window defenestrate for w in words if len w gt 6 words insert 0 w print wo
  • 将 3D 矩阵转换为级联 2D 矩阵

    我有一个3Dpython中的矩阵如下 import numpy as np a np ones 2 2 3 a 0 0 0 2 a 0 0 1 3 a 0 0 2 4 我想转换这个3D矩阵到一组2D矩阵 我努力了np reshape但这并没
  • DRF ManyToMany Field 在创建对象时出现错误

    我有一个Rant模型与Category使用链接到它ManyToManyField 我已经序列化了它 但问题是这个错误 categories Expected a list of items but got type str 这些是我的序列化
  • 在 Python 中打开 Alteryx .yxdb 文件?

    有没有办法将 yxdb Alteryx 数据库文件 导入到 Pandas Python 中 而不使用 Alteryx 作为中间人 简短的回答是否定的 目前还不行 更长的答案 yxdb 支持的原始 C 是可以在 github 上找到 http
  • XGBoost 产生预测结果和概率

    我可能正在文档中查看它 但我想知道 XGBoost 是否有办法生成结果的预测和概率 就我而言 我正在尝试预测多类分类器 如果我能返回Medium 88 那就太好了 分类器 中 预测概率 88 参数 params max depth 3 ob
  • 在自定义 Dask 图中包含关键字参数 (kwargs)

    我正在使用 Dask 为一项操作构建自定义图表 熟悉如何将参数传递给 Dask 图中的函数 并阅读了docs http dask pydata org en latest custom graphs html 然而似乎还是缺少了一些东西 D
  • Boost Python:多态容器?

    我有一个方法 或函数 它返回对多态对象列表的引用 class A class B public A std list
  • 如何在 Pandas 中将多列乘以一列

    我想拥有 df income 1 income 2 df mtaz proportion 返回这些列乘以df mtaz proportion 这样我就可以设置 df mtaz income 1 mtaz income 2 df income
  • 如何在 pygame 中水平翻转图像?

    这是在 pygame 如何翻转图像 假设一个图像 猪向右看 时向左看 我按向左箭头键 然后保持这样 即使我不按任何键或者按向上和向下箭头键 那么 当我按向右箭头键时 如何再次将其切换回向右看 并使其保持这种状态 即使我不按任何键或按向上和向
  • 正则表达式 - Python - 删除前导空格

    我使用正则表达式在文本文件中搜索 产品 一词 然后 我使用该搜索的起点和终点来查看该列并提取整数 有些实例 A 列 有我不想要的前导空格 我只想将数字 如 B 列中的数字 打印到文件中 没有前导空格 正则表达式中的正则表达式 有条件的 pr
  • 在 pandas 中展开列表列时,是否有一种Python式的方法来添加枚举列?

    考虑以下DataFrame gt gt gt df pd DataFrame A 1 2 3 B abc def ghi apply A int B list gt gt gt df A B 0 1 a b c 1 2 d e f 2 3
  • 使用 pywin32com 进行 opc 的内存泄漏

    我很难弄清楚如何解决内存泄漏问题 我认为这可能是 pywin32 的问题 但我不完全确定 我用于读取 写入单个项目的代码似乎工作得很好 但是当使用组函数时 它会慢慢泄漏内存 我怀疑这是来自必须在 server handles 中传递的基于
  • 在Python中寻找坐标系中某些点之间的最短路径

    我编写了一个代码 可以在坐标系中的特定宽度和长度范围内生成所需数量的点 它计算并列出我使用欧几里德方法生成的这些点的距离矩阵 我的代码在这里 import pandas as pd from scipy spatial import dis
  • kombu.exceptions.EncodeError:用户不可 JSON 序列化

    我有 django 1 11 5 应用程序和 celery 4 1 0 我一直收到 kombu exceptions EncodeError
  • Python,socket.error:[Errno 10049]

    在开发一个简单的聊天客户端的基础上 遇到以下错误 socket error Errno 10049 The requested address is not valid in its context 代码是 from socket impo
  • 用python在pygame中制作一个8*8的棋盘

    我想用 python 在 pygame 中制作一个棋盘 只是带有 for 循环的棋盘 我尝试了多种方法来做到这一点 但我不知道它到底是什么 这是我的代码 import pygame pygame init set color with rg
  • 为什么 `Pool.map()` 多处理中的内存消耗急剧增加?

    我正在对 pandas 数据帧进行多重处理 方法是将其拆分为多个数据帧 这些数据帧存储为列表 并且 使用Pool map 我将数据帧传递给定义的函数 我的输入文件约为 300 mb 因此小数据帧大约为 75 mb 但是 当多处理运行时 内存
  • 在 django 视图中执行阻塞请求

    在我的 django 应用程序的一个视图中 我需要执行相对较长的网络 IO 操作 问题是其他请求必须等待该请求完成 即使它们与该请求无关 我做了一些研究并偶然发现了 Celery 但据我了解 它用于执行独立于请求的后台任务 所以我不能使用任
  • 从 Python 脚本创建可执行文件,同时获取较小的输出大小

    我的问题可能已经在某个地方得到了解答 但我仍然找不到直接的答案 我想从 python 代码创建一个独立的可执行文件 我已经尝试过很多解决方案 例如py2exe pyinstaller等等 但我的问题是输出文件大小很大 例如 在pyinsta

随机推荐

  • BEM 块、命名和嵌套

    我正在尝试了解 BEM 命名约定 我被困在这个问题上 我可能误解了一些东西 让我们看看 我有一个侧边栏导航和一个内容导航 我的侧边栏导航看起来像这样 div class sidebar ul class sidebar nav li cla
  • Eclipse 作为 IDE + Mercurial 用于版本控制 + ?错误跟踪 = 好主意? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 对于一个新的 Java Web 项目 我考虑使用 Eclipse 作为 IDE Mercurial 用于版本控制 某种错误跟踪软件 我听说过错误
  • 如果没有打印语句,循环看不到其他线程更改的值

    在我的代码中 我有一个循环等待其他线程更改某些状态 另一个线程可以工作 但我的循环从未看到更改后的值 它永远等待 然而 当我放一个System out println在循环中声明 它突然起作用了 为什么 以下是我的代码示例 class My
  • 如何迭代json对象的所有子节点?

    我想迭代 json 对象的所有节点 并写出一个简单的键值映射 如下所示 name first John last Doe items name firstitem stock 12 name 2nditem stock 23 company
  • 在 dplyr 中使用 select 函数时保留列标签

    我组合了多个数据集并仅保留特定列 但是 当我使用 dplyr 中的选择函数时 它不会保留原始列标签 在我的情况下为项目文本 导入数据后 我使用以下代码来选择要保留的变量 Wave1Data Clean lt select Wave1Data
  • 在Python中使用networkx绘制二部图[重复]

    这个问题在这里已经有答案了 我有一个二分图的 n1 n2 双邻接矩阵 A 矩阵 A 是 scipy sparse csc 矩阵 我想使用 Networkx 中的 A 绘制二分图 假设节点根据其称为 node class 的类标签进行着色 我
  • JetBrains Rider 在 Mac 上启用 ASP.NET MVC 迁移

    我在 macOS Mojave 上安装了 JetBrains Rider 2018 3 我创建了一个 ASP NET MVC 项目 安装了实体框架 6 2 我将连接字符串添加到 web config 中 但是 我不知道如何配置app con
  • Android 中的 USB 加密狗识别 - Beaglebone

    Issue Beaglebone 中的 Android JellyBean4 1 2 无法识别某些华为 USB Dongle 详细 我正在使用在 Android JellyBean4 1 2 上运行的 BeagleBone Huawei E
  • Android NDK调试:设备无法打开

    我现在正在尝试调试我的本机库一段时间 但它不起作用 本机代码可以工作并编译 但出于优化目的 我确实需要调试本机代码 我已经阅读并遵循了许多教程 例如教程1 http mhandroid wordpress com 2011 01 23 us
  • 从 JSON 文件读取数据

    假设我有一个 JSON 文件位于http www randomurl com jobs json http www randomurl com jobs json 它看起来像这样 jobs task turn burgers who Ann
  • 如何在多个环境中处理 OmniAuth 回调?

    我有一个应用程序专门使用 Facebook 作为身份验证提供程序 并已正确设置生产模式的回调 为了实现这一点 您需要为 Facebook 应用程序提供一个站点 URL 和一个用于回调的站点域 在我的例子中是http appname hero
  • Swift 中迭代对象类属性

    Swift 中有没有一种简单的方法来迭代类的属性 即我有一个 Person 类 它有 3 个属性 姓名 姓氏 年龄 有没有类似的东西 for attribute in Person println attribute attribute v
  • 如何在 CQL3 中使复合键列具有空列值

    这听起来可能很愚蠢 因为 SQL 的复合主键中没有空值 但只是想确认我们是否可以在 CQL3 中拥有相同的功能 因此 我们有一个像这样的表来存储宽行 CREATE TABLE keyspace12 colFamily1 id text co
  • 如何安全地实现Java插件安全?

    我正在设计一个用于在 Java 应用程序中加载 处理和支持插件的系统 我认为在部署之前对此绝对至关重要的一个功能是能够建立一个安全的环境 在该环境中插件仅限于允许其执行的操作 我无法理解如何以编程方式使用策略文件而不在启动时运行 Djava
  • 在 php 中创建一个 .sql 文件

    我使用下面的代码来获取 wp option 值 function option value change global wpdb myrows wpdb gt get results SELECT FROM wp options forea
  • 有什么区别?

    我注意到的用法
  • 如何使用 ReactJS 重新加载 iframe?

    我的 ReactJS 组件包含一个 iframe 为了响应外部页面中的事件 我需要重新加载 iframe 如果用户已导航到 iframe 中的另一个页面 我需要将其重置为首次加载该页面时的 URL 该网址可用于this props 我尝试过
  • 如何清除先前绘制的 Matplotlib 文本框?

    我可以在其中制作文本框matplotlib美好的 但我不知道如何从渲染图中删除它们 好像没有figure text clear or figure text visible False 绘制文本框后 这是怎么做到的 与传说不同的是 您似乎无
  • 更改配置单元中的列类型

    我昨天刚开始学习 hive 我一直致力于更改 hive 中列的类型 我想问列类型的更改是否对它们有某种限制 因为我只能进行特定类型的更改 例如我可以将 int 转换为 double string 转换为 double double 转换为
  • type.__setattr__ 与 object.__setattr__ 有什么不同?

    type setattr 用于类 基本上是元类的实例 object setattr 另一方面 用于类的实例 这是完全可以理解的 我没有看到这两种方法之间有显着差异 至少在Python级别 我注意到这两种方法使用相同的属性分配过程 如果我错了