有人可以解释一下 staticmethod 的源代码在 python 中是如何工作的吗

2024-02-29

首先,我了解装饰器一般是如何工作的。而且我知道@staticmethod去掉签名中的实例参数,使得

class C(object):
    @staticmethod
    def foo():
        print 'foo'
C.foo    //<function foo at 0x10efd4050>
C().foo  //<function foo at 0x10efd4050>

valid.

但是我不明白源代码是如何实现的staticmethod使这一切发生。

在我看来,当包装方法时foo in staticmethod,一个实例staticmethod被实例化,那么一些魔法发生,使C.foo() legit.

那么..那些发生了什么magic?做了什么staticmethod do?

我知道关于SO的巨大话题staticmethods但他们都没有解决我的疑虑。但也许我没有点击魔法关键字。如果是这样,请告诉我。

对于任何寻找的人staticmethod源码请参考https://hg.python.org/cpython/file/c6880edaf6f3/Objects/funcobject.c https://hg.python.org/cpython/file/c6880edaf6f3/Objects/funcobject.c


A staticmethod对象是一个描述符 https://docs.python.org/2/howto/descriptor.html。你所缺少的魔力是Python调用__get__将对象作为类或实例的属性访问时的方法。

因此访问对象为C.foo结果 Python 将其转换为C.__dict__['foo'].__get__(None, C), while instance_of_C.foo变成type(instace_of_C).__dict__['foo'].__get__(instance_of_C, type(instance_of_C)).

The staticmethod对象是在C代码中定义 https://hg.python.org/cpython/file/2.7/Objects/funcobject.c#l748,但 Python 中的等效项是:

class staticmethod(object):
    def __init__(self, callable):
        self.f = callable
    def __get__(self, obj, type=None):
        return self.f
    @property
    def __func__(self):
        return self.f

where self.f是原始的包装函数。

所有这些都是必要的,因为函数本身也是描述符;它是为您提供方法对象的描述符协议(请参阅python 绑定和非绑定方法对象 https://stackoverflow.com/questions/13348031/python-bound-and-unbound-method-object更多细节)。因为他们也有一个__get__方法,无需staticmethod包装函数的对象,afunctionobj.__get__call 会生成一个方法对象,并传入一个self争论。

还有一个classmethod,它使用第二个参数descriptor.__get__将函数绑定到类,然后有property对象,它将绑定直接转换为函数调用。看@property 装饰器如何工作? https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work.

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

有人可以解释一下 staticmethod 的源代码在 python 中是如何工作的吗 的相关文章

  • 阻止 TensorFlow 访问 GPU? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以纯粹在CPU上运行TensorFlow 我机器上的所有内存都被运行 TensorFlow 的单独进程占用 我尝试将 per process memory fraction 设置为 0 但未成功
  • 如何覆盖 Django 的默认管理模板和布局

    我正在尝试覆盖 Django 的默认模板 现在只有base site html 我正在尝试更改 django 管理文本 我做了以下事情 我在我的应用程序目录中创建了一个文件夹 opt mydjangoapp templates admin
  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • ImportError:运行 jupyter Notebook 时没有名为 IPython.paths 的模块?

    我通过以下方式安装了 jupyter usr local opt python bin python2 7 m pip install jupyter 这将安装 ipython 版本 4 1 2 但是 当我运行 jupyter Notebo
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • 根据 Pandas 中的列表对多列进行排序

    感谢有关如何根据 pandas 中的倍数列表对给定多列进行排序的任何提示 如下所示 import pandas as pd sort a a d e sort b s1 s3 s6 sort c t1 t2 t3 df pd DataFra
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 对使用 importlib.util 导入的对象进行酸洗

    我在使用Python的pickle时遇到了一个问题 我需要通过将文件路径提供给 importlib util 来加载一些 Python 模块 如下所示 import importlib util spec importlib util sp
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • 在 Spyder 的变量资源管理器中查看局部变量

    我是 python 新手 正在使用 Spyder 的 IDE 我欣赏它的一项功能是它的变量资源管理器 然而 根据一些研究 我发现它只显示全局变量 我找到的解决方法是使用检查模块 import inspect local vars def m
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru

随机推荐

  • 使用 new(Integer) 与 int

    在我的 Java 课上 教授使用了类似的内容 integerBox add new Integer 10 这和刚刚做的一样吗 integerBox add 10 我用谷歌搜索了一下 但找不到一种方法或另一种方法 而且教授也很含糊 我能找到的
  • 查找特殊字符之间的文本并替换字符串

    例如我有一个字符串包含 String s test string 67 Hi 我想得到这个字符串 67 有了星星 我就可以开始替换那部分字符串了 我现在的代码如下所示 String s test string 67 Hi s s subst
  • 如何拦截和抑制 TFrame 子组件的消息?

    我需要拦截WM PASTE message https stackoverflow com questions 10158861 how to intercept detect a paste command into a tmemo 10
  • Java/JSP WEB-INF/类无法导入

    自从我不得不做一些 Java JSP 以来已经有一段时间了 我在 WEB INF classes MyClass java 中有一个 java 类 Netbeans 中的构建成功 我可以在类文件夹中看到 MyClass class 在我的j
  • MariaDB Connector/Python 需要 MariaDB Connector/C >= 3.2.4,发现版本 3.1.14

    Ubuntu 20 04 需要版本 3 2 4 否则 pip3 install mariadb 是不可能的 pip3 install mariadb gt Collecting mariadb Using cached mariadb 1
  • 摇动后停止 Android 加速计

    我想听一下摇晃声 然后完全停止加速度计并转到另一项活动 遗憾的是我没有找到任何方法来做到这一点 即使我计算一个变量并使用简单的 如果 进行检查 每次检测到震动时它总是会再次加载新的活动 请帮助我解决我的不理解 Override protec
  • 加权随机图

    假设我有一个大的二维数组 其值范围在 0 1 范围内 其中 0 表示 不可能 1 表示 极有可能 如何根据上述概率在该数组中选择一组随机点 看待问题的一种方法是 暂时 忽略您正在处理二维网格的事实 你拥有的是一组加权的项目 从这样的集合中随
  • 有没有办法使用 JQuery GetJSON 方法从外部页面获取 HTML?

    假设您正在尝试执行 jquery ajax 请求 例如 ajax url http other website com 据我了解 由于同源原则 这个请求会失败 因为URL是外部域 不过我听说过GetJSON 不遵守此原则 可以使用 JSON
  • 如何从 Python 文件更新 Qml 对象的属性?

    我想在 Qml 中显示一个矩形 并且想从我的 python 代码中更改矩形的属性 宽度 长度 实际上 Python代码中有一个套接字连接 通过该连接从另一台计算机接收宽度和长度的值 简单地说 另一个用户应该能够实时调整这个矩形 我知道如何在
  • 使用 ajax 和 webapi 进行长轮询有什么好处...它会杀死我的服务器吗?和字符串比较

    我有一个非常简单的长轮询 ajax 调用 如下所示 function poll ajax url myserver success function data do my stuff here dataType json complete
  • 如何在Python中显示小数点后100位的无理数?

    我想求小数点后 2 到 100 位的平方根 但默认情况下只显示 10 我该如何更改 decimal http docs python org library decimal html模块派上用场 gt gt gt from decimal
  • 为什么类中不允许函数模板特化?

    在stackoverflow上找到了我的许多问题的答案后 我现在遇到了一个我找不到答案的问题 我希望有人愿意帮助我 我的问题是我想在 C 类中对函数进行显式模板化 我的编译器 g 和 C 标准 14 7 3 告诉我 这种专业化必须在声明类的
  • 图像未从数据库获取

    我在我的服务器中存储了一些图像 我使用 JSON 从服务器获取远程数据 当我将图像存储在本地数据库中时它正在工作 当我使用 json url 时它不起作用 我收到 EXC BAD ACCESS 错误 code Mysof h 文件 inte
  • 如何编写自定义 python 日志处理程序?

    如何编写自定义控制台日志函数以仅在控制台窗口上输出单行日志消息 而不是附加 直到第一个常规日志记录 progress ProgressConsoleHandler console logging StreamHandler logger l
  • Material-UI Next js 链接按钮

    我正在开发一个使用 Next JS 和 Material UI 构建的服务器端渲染 React 项目 我想应用到 Material Uibutton https material ui com api button gt 的与动态路线链接
  • 从 ts 打开选择(角度、ng-select)

    我在页面上有几个 ng selects 并且正在尝试从 ts 打开一个 我可以使用以下命令专注于正确的 ng select ViewChildren NgSelectComponent ngselect QueryList
  • 有效计算 JavaScript 中对象的键/属性的数量

    这个问题几乎与如何有效地计算 JavaScript 中对象的键 属性的数量 https stackoverflow com questions 126100 how to efficiently count the number of ke
  • ScrollView 中的 ListView - 小错误

    我想在滚动视图中有一个列表视图 这个方法几乎完美 https stackoverflow com a 3495908 2811653 https stackoverflow com a 3495908 2811653 当我在一行中输入的文本
  • 如何使用 Nokogiri 的 xpath 和 at_xpath 方法

    我正在学习如何使用 Nokogiri 根据这段代码 我提出了几个问题 require rubygems require mechanize post agent WWW Mechanize new post page post agent
  • 有人可以解释一下 staticmethod 的源代码在 python 中是如何工作的吗

    首先 我了解装饰器一般是如何工作的 而且我知道 staticmethod去掉签名中的实例参数 使得 class C object staticmethod def foo print foo C foo