Вызов другой функции класса в al oop в текущем классе - PullRequest
2 голосов
/ 19 марта 2020

У меня есть 2 класса Emoji и EmojiRun. Я хочу вызвать функцию класса Emoji через EmojiRun, используя бесконечный l oop

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)

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы можете добавить функцию, которая дает вам все выражения, которые поддерживает 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)

Вместо предоставления границ memberfunctions, вы, вероятно, могли бы с тем же успехом вызывать их и выдавать их результаты.

Этот подход работает до тех пор, пока существует всего несколько выражений. Если у вас их много, поддержание функции expressions() становится громоздким. Тем более, когда у вас есть производные классы. В этом случае я бы предложил вам изучить два альтернативных подхода:

  • Самоанализ. По сути, это означает, что вы сканируете объект на наличие методов, которые, например, не принимают параметров (кроме self) и возвращают выражение. Это, вероятно, требует аннотаций возвращаемого типа для функций.
  • Регистрация выражений. Прочитайте документацию для декораторов, которая позволяет вам написать документацию, которая поддерживает список функций выражений для каждого типа. Все, что вам нужно сделать, это добавить префикс объявления функции к @expression_function затем.
0 голосов
/ 19 марта 2020

вы можете попробовать и посмотреть, работает ли следующее

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