【问题标题】:Python can i access a class method from another class without passing it as a parameter?Python我可以从另一个类访问一个类方法而不将它作为参数传递吗?
【发布时间】:2014-08-26 05:26:42
【问题描述】:

使用 LearnPythonTheHardWay 中的 ex43.py(制作游戏)进行实验,并使用 time.sleep() 在事件之间创建暂停。为了启用和禁用该功能,或更改暂停的长度,我只是在class Engine() 中保存了一个变量,该变量在整个程序中对time.sleep() 的调用中被引用。

所以:

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) 进行改进?

【问题讨论】:

    标签: python class variables methods time


    【解决方案1】:

    据我所见,我没有在课堂上使用sleep1 的优势,除非您想在游戏期间更改它。

    传递time.sleep(1) 看起来很乏味。我会说每次调用time.sleep(Class.var) 都可以,并且使代码更清晰。

    我还测试了您的代码,通过暂停并没有给它带来任何好处:

    • 代码更难阅读
    • 你需要通过self.pause(Engine.sleep1)来调用它,这是time.sleep(Engine.sleep1)的一个奇怪的别名。一秒不记得了,需要重新输入到time.sleep()EDIT BELOW
    • 您有更多看起来晦涩难懂的源代码行,使其更难维护

    保持简单。 time.sleep(Engine.sleep1) 不错。

    一个小补充:如果你只等待特定的功能,调用time.sleep() 是完全可以的。但是如果你在每个函数之后都这样做,也许你可以做某种“动作队列”并在每个函数完成后调用time.sleep()。这样,如果您的逻辑发生变化,您可以更新一行代码。

    编辑:要保留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)
    

    每次...

    编辑 2 在这里,我将这个想法与静态方法和打印结合到了say()function 中。

    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)
    

    当我谈论动作队列时,它更像是一个列表,其中包含在每一轮中要调用的类/函数/参数。然后循环将pop每轮从队列中的一个元素执行操作,等待一秒钟然后重新开始。

    【讨论】:

    • 感谢您提供有关在类之外创建 SLEEP1 以使其全局可访问(并使用大写字母命名)的提示。但问题是,一个方法是否必须作为参数传递才能在另一个类方法中可用?其次,有什么方法可以将方法及其参数附加在一起,例如var = time.sleep(1)(我知道这不起作用,因为它只是引用函数的返回值)
    • 如果它是一个实例方法,你必须将它作为参数传递,以便在我认为的另一个类中可用。如果是@staticmethod,则可以调用它而不将其作为参数传递(参见stackoverflow.com/questions/735975/static-methods-in-python
    • 关于您的第二个问题,我的做法是定义一个名为my_sleep() 的函数,其中有time.sleep(1)。所以每次我调用我的函数时,它都会休眠 1 秒。见上面的编辑(回答)
    • 我喜欢 my_pause() 作为静态方法 - 因为这是 OOP 练习。 ` @staticmethod def my_pause(): time.sleep(Engine.sleep1)` 在我接受之前,您愿意将其添加到您的答案中吗?大多数情况下,我使用它只是为了延迟打印出来的句子之间的时间。接受段落字符串并根据\n 或单词数插入time.sleep 的函数会是您所说的“动作队列”吗?
    【解决方案2】:

    我使用的一种方法是创建一个包含其他模块、类及其方法可能需要的所有常量和简单辅助方法的模块,因此它甚至不是一个类,例如helper.py 模块可能如下所示:

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

    我会把那个 helper.py 放到一个库中,比如 mylib,然后像这样从其他模块、类和可执行文件中使用它:

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

    不用说,我不需要用这种方法实例化任何东西。

    【讨论】:

    • 酷。这很简单。或者我可以简单地将函数放在类之外,无论哪种方式都可以轻松地从方法中调用。惊人的。这东西真的没有那么复杂,不是吗?也许有一天我会理解线程......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2016-12-08
    • 2023-03-26
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多