- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以前可以设置内部函数,如 __len__()
在运行时。下面是一个例子:
#! /usr/bin/python3
import sys
class FakeSequence:
def __init__(self):
self.real_sequence = list()
self.append = self.real_sequence.append
self.__len__ = self.real_sequence.__len__
def workaround__len__(self):
return len(self.real_sequence)
if __name__ == '__main__':
fake_sequence = FakeSequence()
fake_sequence.append(1)
fake_sequence.append(2)
fake_sequence.append(3)
length = len(fake_sequence)
sys.stdout.write("len(fake_sequence) is %d\n" % (length))
$ python2 len_test
len(fake_sequence) is 3
$ python3 len_test
Traceback (most recent call last):
File "len_test", line 18, in <module>
length = len(fake_sequence)
TypeError: object of type 'FakeSequence' has no len()
__len__()
方法作为类的一部分(删除上面的“解决方法”),它按您的预期工作。如果我定义
__len__()
并将其重新分配如上
FakeSequence.__len__()
被调用,它不会访问新分配的
__len__()
,它总是调用 FakeSequence 类方法。
最佳答案
魔术方法只在类上查找,而不在实例上查找,如 documented here .在 Py2 中,新式类也是这种情况(参见 https://docs.python.org/2.7/reference/datamodel.html#special-method-lookup-for-new-style-classes)。
我认为主要动机是减少查找以获得更好的性能,但可能还有其他原因,不知道。
编辑:实际上,the motivations are clearly explained in the 2.7 doc :
The rationale behind this behaviour lies with a number of special methods such as hash() and repr() that are implemented by all objects, including type objects. If the implicit lookup of these methods used the conventional lookup process, they would fail when invoked on the type object itself:
Incorrectly attempting to invoke an unbound method of a class in this way is sometimes referred to as ‘metaclass confusion’, and is avoided by bypassing the instance when looking up special methods:
In addition to bypassing any instance attributes in the interest of correctness, implicit special method lookup generally also bypasses the getattribute() method even of the object’s metaclass
Bypassing the getattribute() machinery in this fashion provides significant scope for speed optimisations within the interpreter, at the cost of some flexibility in the handling of special methods
关于python - 在自定义 Python 类中动态重新分配 __len__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59381104/
根据文档,这不起作用,因为: For custom classes, implicit invocations of special methods are only guaranteed to wo
我是编程初学者,目前正在上 Python 类(class)。我正在使用 PyCharm,并且正在编写一个函数来合并字典。我将参数的数量设置为变量,并希望存储调用函数时实际传递的参数数量作为要在 whi
我似乎无法让我的 len 功能正常工作,我一直在尝试很多东西,但我是一个完全的初学者,所以我很确定我错过了一些完全明显的东西。这是我的代码... def __len__(self): if
我正在编写一个简单的链表实现如下: class Node(object): def __init__(self, value): self.value = value
基本上,我想要一个生成器在每个时期重新读取魔术方法 _len__ 以重新计算该时期将完成多少批次。 下面是一段代码: import tensorflow as tf import numpy as n
我想创建一个自定义元素序列。当迭代它时,序列的长度被忽略。这是一个最小的代码示例: class Test(): def __init__(self): pass def
我要实现一些容器对象。 class A: def __init__(self, L): self.L = list(L) def __len__(self):
给定这个相对简单的 tk 脚本: import Tkinter class buttton(Tkinter.Button): def __init__(self,frame,action=No
我正在编写一个充当不可变、无限序列的 python 类。 该类不使用生成器来访问这个无限序列,而是根据 __getitem__ 方法中的算法为序列中的任意索引生成一个值。 我很好奇处理此类对象的 __
以前可以设置内部函数,如 __len__()在运行时。下面是一个例子: #! /usr/bin/python3 import sys class FakeSequence: def __ini
出于我的目的,我创建了一个保留对象的类。 该对象的实际长度是 float ,而不是整数。可能有 2 个对象的差异 - 比如说 0.00001,最短的对我来说是最好的。 为了方便起见,我在类中定义了一个
在这里,我开始创建一个带有文本字段的 TK 窗口,但是当我运行它时,我收到错误 Exception in Tkinter callback Traceback (most recent call la
class Foo: def __getitem__(self, item): print('getitem', item) if item == 6:
调用 len([1,2,3]) 或 [1,2,3].__len__() 有什么区别吗? 如果没有明显的区别,那么在幕后做了什么不同的事情? 最佳答案 len 是一个获取集合长度的函数。它通过调用对象的
我想让 AI 玩我的自定义环境,不幸的是,当我运行我的代码时,出现以下错误: File "C:\Program Files\JetBrains\PyCharm Community Edition
我对 python 很陌生,我一直在玩 Tkinter 和 requests尝试创建一个可以登录到我的 Web 应用程序的简单程序。我一直收到以下错误: Exception in Tkinter ca
我想在 python 中原生实现一个不可变类型。我从这里收集的 How to make an immutable object in Python? 最好的方法是覆盖元组。假设我想要一个存储一些额外数
如何删除此对象中的 __size 属性? class Object(): def __init__(self, size): self.__size = size de
我不熟悉 python 的方法,我在这里看到了一些其他类似描述的问题,但无法解决这个问题。 错误: Traceback (most recent call last): File "C:/Users/
为什么会有人使用双下划线 为什么不直接执行 len([1,2,3])? 我的问题具体是下划线是什么意思? 最佳答案 __len__() 是使用 len() 时调用的特殊 Python 方法。 这很像
我是一名优秀的程序员,十分优秀!