静态方法中的产量与实例相关联?

时间:2015-12-08 22:32:21

标签: python python-3.x generator static-methods

我在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

2 个答案:

答案 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时,我得到了相同的功能。但是,当我两次调用它时,我得到了两个生成器g1g2。正如您在调用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()都会产生一个新的生成器对象。如果你在课外做了这些功能,也会发生同样的情况。