2013-09-09 5 views
0

Как реализовать следующий класс? Я хочу создать класс, который выполняет методы в случайном порядке при вызове и после вызова всех методов после сброса массива и перестановки?Python - класс класса функций

import random 

class RandomFunctions(object): 

    def f1(): 
     print("1") 
    def f2(): 
     print("2") 
    def f3(): 
     print("3") 

    f = [f1, f2, f3] 

    def __init__(self): 
     super(RandomFunctions, self).__init__() 
     random.shuffle(self.f) 

    def execute(self): 
     func = self.f.pop() 
     if not self.f: 
      reset f 
     return func 

def main(): 
    f = RandomFunctions() 
    for i in range(6): 
     f.execute()() 

main() 

Эти две идеи, которые я придумал, но я все еще интересно, что было бы самым разумным способом реализации такого рода класса?

discard = [] 
n = 0 

    def execute(self): 
     func = self.f[self.n] 
     self.n += 1 
     if self.n == len(self.f): 
      self.n = 0 
      random.shuffle(self.f) 
     return func 

    def execute_with_discard(self): 
     func = self.f.pop(0) 
     discard.append(func) 
     if not self.f: 
      f = discard[:] 
      discard = [] 
      random.shuffle(self.f) 
     return func 
+0

Подсказка: ваш конструктор уже содержит большинство методов 'reset()'. Фактор это. Не забудьте заполнить исчерпанный список. Модуль 'copy' может помочь вам скопировать список, или вы можете использовать' copy_of_list = source_list [:] 'idiom. – 9000

ответ

2
import random 

class RandomFunctions(object): 

    def f1(self): 
     print("1") 

    def f2(self): 
     print("2") 

    def f3(self): 
     print("3") 

    def execute(self): 
     if not getattr(self, 'functions', None): 
      self.functions = [self.f1, self.f2, self.f3] 
      random.shuffle(self.functions) 
     return self.functions.pop() 


def main(): 
    f = RandomFunctions() 
    for i in range(6): 
     f.execute()() 


main() 
1

ли это быть классом, как это? Вы можете использовать функцию генератора:

def get_random_functions(*functions): 
    while True: 
     shuffled = list(functions) 
     random.shuffle(shuffled) 
     while shuffled: 
      yield shuffled.pop() 

for f in get_random_functions(f1, f2, f3): 
    f() 

Конечно, если вы предпочитаете структуру класса, вы можете использовать это, создав генератор в вашем __init__ метода (self.gen = get_random_functions(*f)), а затем иметь свое execute метод возвращения next(self.gen).

1
import random 

class RandomFunctions(object): 

    def f1(): 
     print("1") 
    def f2(): 
     print("2") 
    def f3(): 
     print("3") 

    f = [f1, f2, f3] 

    def __init__(self): 
     self.reset() 

    def execute(self): 
     func = self.f.pop() 
     if not self.f: 
      self.reset() 
     return func() # execute the function, return the result (if any) 

    def reset(self): 
     self.f = self.__class__.f[:] # make copy of class f 
     random.shuffle(self.f) 

def main(): 
    f = RandomFunctions() 
    for i in range(6): 
     f.execute()  # now we only need one pair of parenthesis 

main()