如何从类方法中使用`yield`打印类的字符串静态成员

时间:2013-12-20 21:08:15

标签: python

我是python的新手,所以这可能很容易 我想打印一个类中定义的两个字符串作为静态成员,并使用产生每个字符串的类方法。 这是我想要做的简化版本:

#!/usr/bin/python

import sys


class test:
    str1 = "Hello"
    str2 = "World\n" #"\n" is needed for the example

    def printMe(self):
        yield test.str1
        yield test.str2

hello = test()

print "Testing initiated:"
sys.stdout.write(hello.printMe())
sys.stdout.write(hello.printMe())

这是输出:

  

sys.stdout.write(hello.printMe())TypeError:期望一个字符
  缓冲对象

5 个答案:

答案 0 :(得分:1)

你应该做这样的事情

for line in hello.printMe():
    print line

但实际上有比使用yield语句更简单的方法。

答案 1 :(得分:1)

您正在尝试使用生成器功能,请阅读yield关键字here

import sys


class Test: 
    def __init__(self): # it's possible to initialise these attributes in the __init__ method, so they are created on class instantiation(when you did hello = Test())
        self.str1 = "Hello"
        self.str2 = "World\n" #"\n" is needed for the example

    def printMe(self):
        for i in [self.str1, self.str2]:
            yield i 


app = Test()

print "Testing initiated:"

for i in app.printMe():
    print i # is there a reason why you can't use print?

但是,如果你想在代码中的特定点一次打印一行,就像你在评论中提到的循环一样:

gen = app.printMe()

然后每次你想要打印:

gen.next() 

这会触发下一个yield语句。生成器函数有效地“保持”/记住它的位置,直到你再次调用next,直到所有的yield语句都被产生为止。

答案 2 :(得分:0)

你可以这样做,但我正在使用print,希望这可以帮到你:

class test:
    str1 = "Hello"
    str2 = "World\n" #"\n" is needed for the example

    def printMe(self):
        yield test.str1
        yield test.str2

hello = test()

print "Testing initiated:"
out = hello.printMe()
print(out.next(),end=' ')
print(out.next(),end=' ')

答案 3 :(得分:0)

使用yield将您的函数转换为生成器。如果这真的是你想要的,你将需要迭代生成器来获取值:

gen = hello.printMe()
sys.stdout.write(gen.next())
sys.stdout.write(gen.next())

或更好:

for prop in hello.printMe():
    sys.stdout.write(prop)

答案 4 :(得分:0)

您的printMe方法是一个生成器函数,它返回一个可迭代的函数。你需要迭代它才能得到结果:

for item in hello.printMe():
    print item