python - 在当前类中循环调用另一个类函数

标签 python python-3.x function for-loop iterator

我有 2 类 Emoji 和 EmojiRun。 我想通过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 类中,我需要调用函数 facesmilesad。 我可以单独调用它,但我想知道是否有一种方法可以迭代Class 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)

最佳答案

您可以添加一个函数,为您提供 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)

您也可以调用它们并产生它们的结果,而不是提供绑定(bind)成员函数。

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

  • 内省(introspection)。基本上,这意味着您扫描对象以查找方法,例如不接受任何参数(self 除外)并返回一个表达式。这可能需要在函数上添加返回类型注释。
  • 注册表达式。阅读装饰器的文档,它允许您编写一个维护每种类型的表达式函数列表的装饰器。您所要做的就是在函数声明前添加 @expression_function 前缀。

关于python - 在当前类中循环调用另一个类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60751562/

相关文章:

python - `data_files` 与 `setup.py` + `pip` 的跨平台支持

python - 合并具有不同列名但定义相同的多个 CSV

python - 在 NumPy 中,如何在不使用 np.s_ 的情况下从一维数组中提取范围?

python - image.从列表中加载

javascript - Angular Firestore : Check if data exist and update a global variable based on that

python - scrapy中是否有任何手动方式将项目发送到管道

python - 使用 Python 将 PDF 转换为图像

python - 如何使用 Python 查找列中的文本

c函数不返回结果

c - C 中堆栈上的变量创建