我在python 3中写过这个,很奇怪为什么@staticmethod
语句在yield
装饰器下生成的生成器指向每个实例的相同生成器对象,但是却生成特定于实例的结果?
class Note:
def __init__(self):
pass
@staticmethod
def gen():
x = 0
while True:
x +=1
yield x
def id(self):
print(self.gen)
a = self.gen
print(next(a()))
n1 = Note()
n2 = Note()
print(n2.id(),n1.id())
输出:
<function Note.gen at 0x6ffffd7dd08>
1
<function Note.gen at 0x6ffffd7dd08>
1
None None
答案 0 :(得分:1)
不,它没有。尝试使用一个实例,同样会发生:
n1 = Note()
print(n1.id(), n1.id())
每次调用id()
时会创建一个生成器,即每次调用gen()
。
编辑(发电机说明)
我将尝试用这个例子来解释:
>>> def gen():
... yield 1
... yield 2
... yield 3
... yield 4
...
>>>
>>> gen
<function gen at 0x00000000029119C8>
>>> gen
<function gen at 0x00000000029119C8>
>>> g1 = gen()
>>> g2 = gen()
>>> g1
<generator object gen at 0x00000000025515A0>
>>> g2
<generator object gen at 0x000000000258B870>
>>> next(g1)
1
>>> next(g1)
2
>>> next(g2)
1
>>> next(g2)
2
>>> next(g1)
3
>>>
如上所示,gen
不是生成器。这是一个功能。该函数的返回值是一个生成器。所以,当我多次打印gen
时,我得到了相同的功能。但是,当我两次调用它时,我得到了两个生成器g1
和g2
。正如您在调用next
时所看到的那样,每个状态都保持其状态。
编辑2(原始示例已修复)
顺便说一句,我想在你的代码中你试图这样做:
import itertools
class Note:
gen = itertools.count(1)
def __init__(self):
self.id = next(self.gen)
n1 = Note()
n2 = Note()
print(n2.id, n1.id)
编辑3(同一地址中的对象)
试试这个例子:
class A:
def __init__(self, name):
self.name = name
print('Created a new A %s with name %s' % (self, name))
def f(name):
# create a new object A
a = A(name)
# a not stored anywhere, so Python will delete it now
f('one')
f('two')
f('three')
在我的测试中,它输出:
Created a new A <__main__.A object at 0x00000000029C0CF8> with name one
Created a new A <__main__.A object at 0x00000000029C0CF8> with name two
Created a new A <__main__.A object at 0x00000000029C0CF8> with name three
答案 1 :(得分:0)
你创造了两个发电机;每次调用Note.gen()
都会产生一个新的生成器对象。如果你在课外做了这些功能,也会发生同样的情况。