Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在当前类的循环中调用另一个类函数_Python_Python 3.x_Function_For Loop_Iterator - Fatal编程技术网

Python 在当前类的循环中调用另一个类函数

Python 在当前类的循环中调用另一个类函数,python,python-3.x,function,for-loop,iterator,Python,Python 3.x,Function,For Loop,Iterator,我有两类表情符号和表情符号。 我想通过EmojiRun调用Emoji类函数,使用无限循环 class Emoji: def __init__(self): self.green = (0, 255, 0) self.yellow = (255, 255, 0) self.blue = (0, 0, 255) self.red = (255, 0, 0) self.white = (255, 255, 255)

我有两类表情符号和表情符号。 我想通过EmojiRun调用Emoji类函数,使用无限循环

class Emoji:
    def __init__(self):
        self.green = (0, 255, 0)
        self.yellow = (255, 255, 0)
        self.blue = (0, 0, 255)
        self.red = (255, 0, 0)
        self.white = (255, 255, 255)
        self.nothing = (0, 0, 0)
        self.brown = (165, 42, 42)

    def face(self):
        return face

    def smile(self):
        return smile

    def sad(self):
        return sad
在我的EmojiRun类中,我需要调用函数
face
smile
sad
。 我可以单独调用它,但是我想知道是否有一种方法可以迭代类Emoji的函数,就像下面的例子一样,我知道它是错误的

#Main class to run Emoji
from animatedEmoji import Emoji
from sense_hat import SenseHat
from time import sleep

#Class instance emoji
emoji = Emoji()
sense = SenseHat()

while True:
  #Forloop to call emoji functions 1 by 1
  for x in Emoji:
     sense.set_pixels(emoji.function[x])
     sleep(3)

你可以试试看下面的方法是否有效

>>> for k,v in Emoji.__dict__.items():
...   if "function" in str(v):
...     print(k)
... 
sad
smile
face
__init__

您可以添加一个函数,该函数提供
Emoji
支持的所有表达式:

class Emoji:
    ... // same code as before
    def expressions(self):
        yield self.face
        yield self.smile
        yield self.sad
然后,您可以使用以下命令来调用它:

e = Emoji()
for exp in e.expressions():
    sense.set_pixels(exp())
    sleep(3)
与其提供绑定成员函数,还不如调用它们并产生结果

只要只有少量表达式,这种方法就可以工作。一旦有了许多表达式,维护
expressions()
函数就会变得很麻烦。当您有派生类时,情况更是如此。在这种情况下,我建议您研究两种替代方法:

  • 内省。基本上,这意味着您可以扫描对象以查找方法,例如,不获取任何参数(除了
    self
    )并返回表达式。这可能需要函数上的返回类型注释
  • 注册表达式。阅读decorators文档,它允许您编写一个维护每种类型的表达式函数列表的decorator。您只需在函数声明前面加上
    @expression\u函数

你可以有一种工厂函数,它返回
{face:face(function face),smile:smile,sad:sad}
,然后调用这个函数,这个函数返回dict,对它进行迭代,并以循环的方式调用函数,这样做有帮助吗?为什么你的函数
sad
返回
sad
?如果你的emoji类至少可以编译,那么它会有帮助,当前的方式需要猜测,这总是不好的。它可以工作,但我不需要init,否则我的驱动程序会崩溃。(y)