类方法输入变量

2024-04-29 01:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

通常,当我用Python(和其他语言)创建类时,我很难决定哪种方法更好:(a)在方法函数中使用实例变量,或者(b)在函数定义中列出输入变量。在

(一)

    class ClassA(object):
        def __init__(self, a):
            self.variable_a = a

        def square_a(self):
            return self.variable_a ** 2

(二)

^{pr2}$

这些例子非常简单和明显,但强调了我觉得困惑的是哪个是更好的主意。此外,是否禁止在__init__方法之外设置实例变量?例如:

   class ClassC(object):
        def __init__(self, c):
            self.variable_c = c

        def square_c(self):
            self.square_of_c = self.variable_c ** 2

编辑:我理解这个问题有点模糊的本质,但我问这个问题是因为很难知道人们希望在我为协作项目编写的源代码中看到什么。如果我给出的一个或多个例子是反模式,我的想法是,这个问题将为我提供有用的见解。在

政治公众人物20:

There should be one-- and preferably only one --obvious way to do it.


Tags: 实例方法函数self语言定义objectinit
2条回答

在这个例子中,(b)作为成员函数不是很有用。它可以很容易地成为一个自由函数:

def square(input_var):
    return input_var ** 2

这无疑是一个更好的接口,因为它可以在任何上下文中使用,而不仅仅是来自ClassB的实例。在

一般来说,如果我知道self.variable_a是函数需要的唯一输入,我会使用(a)。如果我想让它和任何东西一起工作,并且它不依赖于类中的任何东西,我会让它成为一个自由函数。如果我想让它处理任何事情,但它依赖于某个类状态,那么让它成为一个以输入为参数的成员。举个例子,如果ClassA同时包含variable_avariable_b怎么办?您不能使用square_a来修改variable_b,这取决于实际的用例。在

Furthermore, is it taboo to set an instance variable outside of the init method?

不,但通常最好确保所有成员都在类实例化时的某个地方初始化。即使您只是将成员初始化为None。检查一个成员变量是否是None要比试图确定是否定义它要容易得多。在

编辑:还有几个例子:

^{pr2}$

你的问题很模糊,因此很难回答。所有的类似乎都有正确的语法。在

但是b)对我来说比a)更有用 看起来你只想返回输入变量的平方,所以我假设你想一直计算不同值的平方。如果在情况a)中这样做,则必须在每次调用方法之前设置变量。在

b)让我想知道您使用变量_b做什么,因为它从未真正使用过。但我想这是因为简化了。
您还可以考虑将square bu astatic method,因为它不使用任何对象属性。(从不调用self

class ClassB(object):
    def __init__(self, b):
        self.variable_b = b

    @staticmethod
    def square_b(input_var):
        return input_var ** 2

变体c)在语法方面也是有效的,但有些人可能会认为这是一种不好的做法。这确实是一个品味问题,但许多书籍和网站都会建议您在init方法中声明变量。在

相关问题 更多 >