2014-07-04 7 views
1

Экспериментируйте с ex43.py (создайте игру) из LearnPythonTheHardWay и с помощью time.sleep() создайте паузы между событиями. Чтобы включить или отключить функцию или изменить длину пауз, я просто держу переменную в class Engine(), на которую ссылаются от звонков на time.sleep() по всей программе.Python может ли я получить доступ к методу класса из другого класса, не передавая его в качестве параметра?

Итак:

import time 

class Engine(object): 

    sleep1 = 1 

    #some methods 
    def say_hello(self, exit): 
     self.exit = exit 
     print "Hello" 
     time.sleep(Engine.sleep1) 
     self.exit.say_goodbye() 

class Another(object): 

    def say_goodbye(self): 
     print "ok" 
     time.sleep(Engine.sleep1) 
     print "goodbye." 

me = Engine() 
bye = Another() 
me.say_hello(bye) 

Вопрос заключается в том, если я хочу time.sleep(1) быть доступны для нескольких методов различных классов, это необходимо передать каждый метод, который нуждается в ней в качестве параметра, как это:

import time 

class Engine(object): 

    sleep1 = 1 

    #some methods 
    def say_hello(self, exit): 
     self.exit = exit 
     print "Hello." 
     time.sleep(Engine.sleep1) 
     pause = time.sleep 
     self.exit.say_goodbye(pause) 

class Another(object): 

    def say_goodbye(self, pause): 
     self.pause = pause 
     print "ok" 
     self.pause(Engine.sleep1) 
     print "goodbye." 

me = Engine() 
bye = Another() 
me.say_hello(bye) 

И для того, чтобы иметь только одно место, где можно установить продолжительность паузы, есть улучшение на простом вызов time.sleep(Class.var) от какого-либо метода?

ответ

1

Из того, что я видел, я не получаю преимущество наличия sleep1 внутри класса, за исключением случаев, когда вы хотите изменить его во время игры.

Передача time.sleep(1) вокруг выглядит довольно утомительно. Я бы сказал, что вызов time.sleep(Class.var) каждый раз в порядке и делает код более четким.

Я также протестировали свой код и прохождение паузы не добавляет никаких преимуществ к нему:

  • код труднее читать
  • вам нужно вызвать его, делая это self.pause(Engine.sleep1), который является странным псевдоним для time.sleep(Engine.sleep1). Один второй не запоминается, так что вы должны ввести его снова, чтобы time.sleep()EDIT НИЖЕ
  • у вас есть больше строк исходного кода, которые кажутся неясными, что делает его намного труднее поддерживать

Держите это просто , time.sleep(Engine.sleep1) хороший.

Одно небольшое дополнение: если вы только ждете определенных функций, то вызов time.sleep() - это прекрасно. Но если вы делаете это после каждой функции, возможно, вы можете сделать какую-то «очередь действий» и вызвать time.sleep() после завершения каждой функции. Таким образом, если ваша логика изменится, вы можете обновить одну строку кода.

EDIT: Чтобы сохранить функцию и его параметры для time.sleep(), я хотел бы сделать следующее:

MY_SLEEP = 1 

def my_pause(): 
    time.sleep(MY_SLEEP) 

my_pause() # waits 1 second 
my_pause() # waits 1 second again. 

, но затем снова, вы могли бы просто:

time.sleep(MY_SLEEP) 

каждый раз .. .

EDIT 2 Здесь я несколько объединили идею со статическим методом и печать в функцию say().

import time 

MY_SLEEP = 1 # inside a config file 

class Engine(object): 

    @staticmethod 
    def say(text): 
     print(text) 
     time.sleep(MY_SLEEP) 

    #some methods 
    def say_hello(self, exit): 
     Engine.say("Hello") 
     exit.say_goodbye() 

class Another(object): 

    def say_goodbye(self): 
     Engine.say("ok") 
     Engine.say("goodbye") 

me = Engine() 
bye = Another() 
me.say_hello(bye) 

Когда я говорил об очереди действий, это было больше похоже на список, содержащий какой класс/функция/ARG для вызова в каждом раунде. Затем цикл будет pop один элемент из очереди на каждом шагу, выполните действие, подождите одну секунду и начните снова.

+0

Благодарим вас за отзыв о создании SLEEP1 вне класса, чтобы сделать его доступным по всему миру (и присвоить имена CAPS). Но вопрос в том, действительно ли должен быть передан метод как параметр, доступный в рамках другого метода классов? И во-вторых, есть ли способ присоединить метод AND его параметр вместе, например, 'var = time.sleep (1)' (который, как я знаю, не будет работать, потому что он просто ссылается на возвращаемое значение функции) – MikeiLL

+0

Если это экземпляр метод, вам придется передать его как параметр, который будет доступен в другом классе, я думаю. Если это '@ staticmethod', вы можете вызвать его, не передавая его в качестве параметра (см. Http://stackoverflow.com/questions/735975/static-methods-in-python) – achedeuzot

+0

О вашем втором вопросе, как я это определяет функцию, называемую 'my_sleep()', в которой у меня есть 'time.sleep (1)'. Поэтому каждый раз, когда я называю свою функцию, он спит в течение 1 секунды. См. Править выше (в ответе) – achedeuzot

1

Подход, который я использую, заключается в создании модуля со всеми константами и простыми вспомогательными методами, которые могут потребоваться для других модулей, классов и их методов, поэтому это даже не класс, например. модуль helper.py может выглядеть следующим образом:

var1 = 1 
var2 = 2 
def method1(): 
    ... 
def method2(): 
    ... 

Я бы поставил этот helper.py в библиотеку, скажет MyLib, а затем использовать его из других модулей, классов и исполняемые файлы, как это:

from mylib import helper 
print helper.var1 
helper.method1() 
helper.method2() 

Излишне говорить, что мне не нужно создавать что-либо с этим подходом.

+0

Прохладный. Это довольно просто. Или я могу просто поставить функцию вне класса и в любом случае ее можно легко вызвать из метода. Потрясающие. Этот материал действительно не так уж сложный, не так ли? Может быть, когда-нибудь я даже пойму темы ... – MikeiLL