- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我按如下方式定义 __iter__
方法,它将不起作用:
class A:
def __init__(self):
self.__iter__ = lambda: iter('text')
for i in A().__iter__():
print(i)
iter(A())
结果:
t
e
x
t
Traceback (most recent call last):
File "...\mytest.py", line 10, in <module>
iter(A())
TypeError: 'A' object is not iterable
如您所见,调用 A().__iter__()
有效,但 A()
不可迭代。
但是,如果我为类定义 __iter__
,那么它将起作用:
class A:
def __init__(self):
self.__class__.__iter__ = staticmethod(lambda: iter('text'))
# or:
# self.__class__.__iter__ = lambda s: iter('text')
for i in A():
print(i)
iter(A())
# will print:
# t
# e
# x
# t
有谁知道python为什么要这样设计?即为什么 __iter__
作为实例变量不起作用?你不觉得它不直观吗?
最佳答案
这是设计使然。您可以在此处找到详细说明:https://docs.python.org/3/reference/datamodel.html#special-method-lookup
简短回答:必须在类对象本身上设置特殊方法,以便解释器始终如一地调用它。
长答案:这背后的想法是加快众所周知的 build 。在你的例子中:
class A:
def __init__(self):
self.__iter__ = lambda: iter('text')
在现实生活中,您打算多久编写一次这样的代码?所以,Python 所做的 - 它跳过了实例的字典查找,即 iter(A())
根本没有“看到” self.__iter__
,这实际上是self.__dict__['__iter__']
在这种情况下。
它还跳过所有 __getattribute__
实例和元类查找,从而获得显着的加速。
关于python - 为什么 `__iter__` 定义为实例变量时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43346584/
我正在实现本质上是一个容器对象(尽管它确实有一些自己的逻辑)。我希望能够迭代此类(这只是一个普通列表)中的一个字段中的项目。我应该为我的类(class)重新实现 __iter__ 和 next 还是可
本人python水平很差,请不要打我。 >>> a = ['a', 'b', 'c'] >>> a.__iter__() >>> a.__iter__().__iter__() 我看到这两个 li
在 python 2.7 和 python 3.7 中,我可以执行以下操作: string = "hello world" for letter in string: print(letter
假设我有一个基类: class Base: A = False B = '' C = '' def __iter__(self): yield 'a',
Python 类定义中的 __iter__ 方法主体有何意义?据我了解, __iter__ 方法必须返回一个迭代器;那么每个 __iter__ 方法不应该只包含一个返回迭代器(在其他地方定义)的 re
我正在尝试创建一个二维数组类并希望使矩阵可迭代。有谁知道该怎么做?我是 python 类(class)的新手,但仍在掌握窍门。另外,如何在我的 main 中实现 str ?如果我只使用 print(c
我读了一本有关 Python 高级主题的书。作者试图解释生成器。 这是他要解释的例子: class rev: def __init__(self,data): self.dat
不确定标题是否清楚,但我有一个对象,它的属性是另一种对象的字典。键是引用对象的 id。我想实现 iter 方法,以便生成这些 key ,但我不确定如何操作。它应该相当简单,但我在 python 文档中
def __init__(self, maximum, start=0, step=1): """Sets the maximum, start, and step"""
我想做的是重用生成器 class Rect(object): ... def __iter__(self): for y in xrange(self.tl.y, self.
使用__iter__有什么好处? Python 类中的函数? 在下面的代码中,我只是设置两个简单的类。第一类接受一个列表作为参数,我可以在不使用 __iter__ 的情况下循环这个列表。功能。第二位代
我不明白为什么 __iter__ 特殊方法只返回调用它的对象(如果它是在迭代器上调用的)。它本质上只是一个标志,表明该对象是一个迭代器吗? 编辑:实际上,我发现“这是允许容器和迭代器与 for 和 i
我有一个对象子类,它使用缓存生成器实现动态调度 __ iter __(我还有一个使 iter 缓存无效的方法),如下所示: def __iter__(self): print("iter ca
尽管阅读了它,但我仍然不太明白 __iter__ 是如何工作的。什么是简单的解释? 我见过 def__iter__(self): return self。我看不到它是如何工作的,也不知道它是如何工作的
我正在实现搜索算法 (BFS) 并具有以下 Node 类: class Node: def __init__(self, state=None, action=None, path_cost=
我有一个 Python 2.7 类(称之为 Child),它是另一个类(Parent)的子类,而另一个类本身就是 dict 的子类。 我正在尝试定义 __iter__在 child 中希望当有人做di
我想将一个类的所有实例存储在一个列表中,并想对其进行迭代。 我尝试了以下两种方法: 1 使用元类 class ClassIter(type): def __iter__(cls):
来源 def flags(*opts): keys = [t[0] for t in opts] words = [t[1] for t in opts] nums = [2*
假设您使用包装器对象: class IterOrNotIter: def __init__(self): self.f = open('/tmp/toto.txt')
我有一个标准的二叉树,如下所示 1 /\ 2 3 /\/\ 4 5 6 7 我需要通过导入我的树类来读取二叉树,创建这棵树,然后使用 for 循环读取它,如:[4, 2, 5, 1, 6, 3, 7]
我是一名优秀的程序员,十分优秀!