【问题标题】:How to pass return value of method within class?如何在类中传递方法的返回值?
【发布时间】:2020-03-05 15:29:42
【问题描述】:

从类中的方法传递返回值的正确方法是什么?你总是在需要的时候调用该方法还是可以将返回的值存储在 init 方法中? 假设我有:

class Foo():

    def __init__(self):

    def heavy_method(self):
        #slow crunching
        return crunch

    def use_heavy_crunch(self):
        data = self.heavy_crunch()
        for i in data:
            #do data stuff
            #return data stuff

    def other_func_that_need_heavy_method(self):
        pass

d = Foo()
d.use_heavy_crunch()

我想知道上面的结构是正确的方式还是下面的方式是等效的或更好的?

class Foo()

    def __init__(self):
        self.data = None

    def heavy_method(self):
        #slow crunching
        self.data = crunch

    def use_heavy_crunch(self):
        for i in self.data:
            #do data stuff
            #return data stuff

    def other_func_that_need_heavy_method(self):
        pass

d = Foo()
d.heavy_method()
d.use_heavy_crunch()

所以在上面的例子中,一个方法在另一个方法中被调用,而在下面的例子中,方法的返回值被传递给 init 方法中的一个变量,然后在另一个函数中使用。

【问题讨论】:

    标签: python methods initialization


    【解决方案1】:

    如果我理解正确,您正在尝试做类似的事情

    class Foo():
    
        def __init__(self):
            self.data = self.heavy_method() # we assign the return value to an attribute of our object
    
        def heavy_method(self):
            #slow crunching
            return crunch
    
        def use_heavy_crunch(self):
            for i in self.data: # Notice it's now self.data
                #do data stuff
                #return data stuff
    
        def other_func_that_need_heavy_method(self):
            pass
    
    d = Foo()
    d.use_heavy_crunch()
    

    【讨论】:

    • 是的,这正是我想做的,但不太确定这是否是做事的“正确方式”?
    • 可能,是的。如果你知道你将总是想要使用self.data,它应该在初始化中。如果您只是有时使用它......那么这取决于您的实现,您是否喜欢节省内存或节省计算能力,以及最容易阅读/调试的内容。请记住,您也不需要保存变量,您可以随时调用d.use_heavy_crunch(d.heavy_method()) 来提供数据。同样,它不仅对计算机,而且对程序员阅读也是最有效的。
    • 我依靠d.use_heavy_crunch() 能够通过类中的函数加载更多数据。感谢您指出问题的不同方面,我没有想到内存节省/计算能力。我倾向于只看到慢-坏,好-快。感谢您的见解!
    • @MisterButter 假设你有 CPU 和内存来处理它,你总是可以实现多线程/多处理来加快速度,假设它们可以并行运行。如果您担心速度,您还可以尝试不同的实现,并为每次设置的多次运行结果计时。通常,在您的代码首先运行之前优化速度是不明智的......
    • 确实如此,在我的情况下,提高速度的唯一方法是通过多线程/多处理,因为耗时的过程是对 api 的请求,并且不缺乏计算机能力,(仍然是 2012 Mac,没什么花哨的)。
    【解决方案2】:

    您不希望类的初始化方法执行繁重的处理任务,这通常是不好的做法,类初始化应该只用于初始化基于类的实例变量。 如果您打算在创建实例d 之后多次调用d.use_heavy_crunch() 并且d.heavy_method() 的返回值没有随时间变化,那么第二种方法是不错的选择,就像第一种方法一样每次您拨打d.use_heavy_crunch() 时,您都在拨打d.heavy_method() 并重复执行相同的任务。在第二种方法中,您只需调用一次d.heavy_method(),然后在其他类方法中使用它的结果。

    【讨论】:

    • 我明白了,感谢您提供宝贵的见解并直言不讳!
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2014-09-04
    相关资源
    最近更新 更多