Python:将 self 传递给类方法或参数

sel*_*ame 6 python oop

我正在开发一个 python 项目,其中的类有很多参数和方法。为了降低复杂性,我一直这样编写方法:

def foo(self):
    return self.parameter1 * self.parameter2
Run Code Online (Sandbox Code Playgroud)

显式传递参数会是更好的做法吗?

def foo(self, parameter1, parameter2):
    return parameter1 * parameter2
Run Code Online (Sandbox Code Playgroud)

出现这种情况是因为我发现在不测试整个类的情况下很难测试类中的函数。

Ste*_*uch 5

您的问题做出了一些与面向对象设计不一致的假设。

如果parameter1parameter2 不是所表示的对象的内在属性self,则需要传递它们。然而,如果它们是 的内在属性self,那么它们应该已经与 相关联self并且不需要传递。

OO 设计以及一般对象的一大要点是显式地将描述对象的数据与处理该对象的方法关联在一起。

回答:

使用self对象固有的任何内容的引用,并将非对象的值作为参数传递。


Kir*_*hou 1

为了降低复杂性,我一直这样编写方法

这个目的的假设是错误的,如果定义实例方法,则应该使用 self(实例变量)。

根据pylint: method_could_be_a_function:如果一个函数可以在没有 self(实例变量)的情况下运行,那么它应该是一个单独的函数,而不是实例方法。

例如:

class A(object):

    def __init__(self):
        self.some_instance_var

    def some_instance_method(self):
        #code here is suggested to be related to self(instance variable), eg:
        return self.some_instance_var
Run Code Online (Sandbox Code Playgroud)

这个方法适合作为实例方法放入类中。

class A(object):

    ...

    def foo(self):
        return self.parameter1 * self.parameter2
Run Code Online (Sandbox Code Playgroud)

而且这个应该是一个普通的函数,而不是实例方法。因为函数的内容与self(实例变量)无关。

def foo(self, parameter1, parameter2):
    return parameter1 * parameter2
Run Code Online (Sandbox Code Playgroud)