为什么 Python 使用“魔法方法”?

2023-11-25

我对 Python 广泛使用“魔术方法”感到有点惊讶。

例如,为了让一个类声明实例具有“长度”,它实现了__len__方法,当您编写时会调用该方法len(obj)。为什么不直接定义一个len作为对象的成员直接调​​用的方法,例如obj.len()?


See also: Why does Python code use len() function instead of a length method?


AFAIK, len在这方面很特殊并且有历史根源。

这是一个报价来自常见问题解答:

为什么Python对某些事情使用方法 功能(例如 list.index())但是 其他函数(例如 len(list))?

主要原因是历史。功能 用于那些操作 是一组类型的通用并且 其目的甚至是为 没有方法的对象 所有(例如元组)。也是 方便有一个功能可以 容易应用于非晶态 使用时的对象集合 Python 的函数特性(map()、 apply() 等)。

事实上,实现len()、max()、 min() 作为内置函数是 实际上比实现更少的代码 它们作为每种类型的方法。一罐 对个别案例有争议,但 它是 Python 的一部分,而且也是 做出如此根本性的改变已经太晚了 现在。功能必须保留 避免大量代码损坏。

其他的“神奇方法”(其实叫特殊方法在 Python 民间传说中)很有意义,并且其他语言中也存在类似的功能。它们主要用于在使用特殊语法时隐式调用的代码。

例如:

  • 重载运算符(存在于 C++ 和其他语言中)
  • 构造函数/析构函数
  • 用于访问属性的钩子
  • 元编程工具

等等...

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

为什么 Python 使用“魔法方法”? 的相关文章

随机推荐

  • 如何将存储过程放置在所需位置?

    在 SQL Server 2008 上 如何将存储过程放置在数据库的 存储过程 文件夹中 当我这样声明时 CREATE PROCEDURE mySchema myProc 它转到 MYSERVER System Databases Mast
  • HTML5 Draggable setDragImage 不适用于 Chrome 上的画布

    我正在尝试在本机 HTML5 拖放 API 中使用画布作为我的拖动图像 问题是它可以在 Firefox 上运行 但不能在 Chrome 58 上运行 我无法查明问题所在 Code https jsfiddle net 196urLwd 5
  • C++ 数组大小声明和 const

    我刚刚从 C 转向 C 在 C 89 90 中 const实际上不是一个常数 与 define d enum或字面量 但一旦设置则为只读 即 我可以 const int x rand 没关系 重点是x直到运行时才知道 因此 我不能 int
  • 使用多处理从不同进程附加到同一列表

    我需要将对象附加到一个列表中L使用 multiprocessing 来自不同的进程 但它返回空列表 如何让许多进程附加到列表中L使用多处理 usr bin python from multiprocessing import Process
  • 为什么 python 对文件句柄的数量有限制?

    我编写了简单的代码进行测试 在 python 脚本中可以打开多少文件 for i in xrange 2000 fp open files file d i w fp write str i fp close fps for x in xr
  • 自旋锁与 std::mutex::try_lock

    使用专门设计的自旋锁有什么好处 例如http anki3d org spinlock 与这样的代码 std mutex m while m try lock do work m unlock 在典型的硬件上 有巨大的好处 你天真的 假自旋锁
  • 这个字符是什么? 65279''

    我有两根弦 一个是 另一个是 我认为它们是相同的 然而 String Compare说他们是不同的 这很奇怪 这是我的代码 string b string c if string Compare b c 0 Console WriteLin
  • Server 2008 R2 上的 MVC - 如何?

    我有一个新的 WIndows Server 2008 R2 x64 DataCentre 安装了 Framework 3 5 SP1 和 Framework 4 当我安装 MVC 应用程序 使用 Web 安装项目安装程序的 VS 2008
  • Python:给出给定日期的周开始和结束数据

    day 13 Oct 2013 print Parsing day day mon yr day split sday yr day mon myday time strptime sday Y d b Sstart yr time str
  • Java 类相互引用

    我有两个java类文件 他们每个人都有对方使用的方法 public class class1 class2 c2 new class2 m1 c2 ma m2 m2 public class class2 class1 c1 new cla
  • .net Framework 4.0 的 File.ReadLines(..) 方法中的错误

    这段代码 IEnumerable
  • Proguard 和 Android :(

    我试图在我的 Android 应用程序上运行 Proguard 并遇到问题 我正在使用 SpongyCastle jar 完整的充气城堡的复制和过去 并重命名了包 因此它不会与 Android 充气城堡内置版本冲突 运行 proguard
  • 移动某些数组元素的函数方法如何?

    我有一个 Scala 应用程序 其中包含带有复选框的项目列表 以便用户选择一些项目 然后单击按钮将它们向上移动一个位置 左 我决定编写一个函数来移动满足给定谓词的某种任意类型的元素 所以 如果你有这些元素 a b c D E f g h I
  • 将纪元时间转换为具有特定时区的人类可读时间

    要将纪元日期时间转换为人类可读的 使用一个简单的new date 1495159447834 就足够了 我现在遇到的问题是 对于我的混合应用程序 如果用户将手机日期时间设置中的时区设置为 GMT 12 00 则人类可读的日期时间将与我想要的
  • 查找 Java 方法的字节码大小

    我试图计算出方法的字节码大小 因为我想确保它足够小 可以通过编译器优化内联 我看到内联方法的默认最大大小是 35 因此如果该方法大于该大小 我将修改代码或将其分解为多个方法 我有一个方法可以生成下面的字节码 通过 IntelliJ IDEA
  • SQL除两个整数并得到小数值错误[重复]

    这个问题在这里已经有答案了 在 SQL 语句中 我试图除以两个整数 整数 1 在我的代码中为 abc 整数 2 在我的代码中为 xyz 并得到十进制结果 在我的代码中为 def 小数结果应仅以 1 或 0 开头 后跟一个小数和小数点后 3
  • 如何在javascript中获取json键和值?

    我返回一个 json 如下所示 name skills jobtitel Entwickler res linkedin GwebSearch 我试图获取每个元素的键和值 done function data alert data jobt
  • Summernote - 图片 url 而不是 Base64

    Summernote wysiwyg 编辑器将图像文件编码为 Base64 嗯 这看起来很方便 但我预计数据库会在长期内被大量使用 这会导致一些问题 搜索速度慢 实现图像库等等 我想知道它是否有一个选项可以关闭此编码选项并使用 插入 url
  • 获取摆动组件的位置

    我已将一些 JPanel 放入另一个 JPanel 中 其布局是框布局和 Y 轴 放置所有面板后 我需要从 JPanel 容器面板中获取每个添加的 JPanel 的 Y 位置 但是 当我尝试得到这个值时 每个 JPanel 的 Y 位置总是
  • 为什么 Python 使用“魔法方法”?

    我对 Python 广泛使用 魔术方法 感到有点惊讶 例如 为了让一个类声明实例具有 长度 它实现了 len 方法 当您编写时会调用该方法len obj 为什么不直接定义一个len作为对象的成员直接调 用的方法 例如obj len See