如何将参数传递给第一个参数为 self 的 python 函数?

How to pass arguments to python function whose first parameter is self?

举个简单的例子。

class A(object):
    variable_A = 1
    variable_B = 2

    def functionA(self, param):
        print(param+self.variable_A)

print(A.functionA(3))

在上面的例子中,我得到以下错误

Traceback (most recent call last):
  File "python", line 8, in <module>
TypeError: functionA() missing 1 required positional argument: 'param'

但是,如果我在函数声明中删除 self,我将无法访问 class 中的变量 variable_Avariable_B,并且我收到以下错误

Traceback (most recent call last):
  File "python", line 8, in <module>
  File "python", line 6, in functionA
NameError: name 'self' is not defined

那么,我如何访问 class 变量而不在此处出现参数错误? 我正在使用 Python 3 仅供参考。

先创建A的对象

a = A()
a.functionA(3)
上面代码段中的

functionA 是一个实例方法。您不直接将 "self" 传递给它。相反,您需要创建一个实例才能使用它。该函数的 "self" 参数实际上是调用它的实例。例如:

a = A()
a.functionA(3)

P.S。 请注意,您的 functionA 调用了 print 但没有调用 return 任何东西,这意味着它隐含地 returns None。你应该给它 return 一个值并从调用者打印它,或者像我上面所做的那样,调用它并让它自己打印。

您必须先创建 class A

的实例
class A(object):
    variable_A = 1
    variable_B = 2

    def functionA(self, param):
        return (param+self.variable_A)


a = A()
print(a.functionA(3))

如果不想使用实例,可以使用静态方法装饰器。 静态方法是方法的特例。有时,您会编写属于 class 的代码,但根本不使用对象本身。

class A(object):
    variable_A = 1
    variable_B = 2

    @staticmethod
    def functionA(param):
        return (param+A.variable_A)

print(A.functionA(3))

另一种选择是使用 class 方法装饰器。 Class 方法是未绑定到对象的方法,而是绑定到 class!

class A(object):
    variable_A = 1
    variable_B = 2

    @classmethod
    def functionA(cls,param):
        return (param+cls.variable_A)

print(A.functionA(3))

当函数对象(def 语句创建的对象)是 class 的属性并且在 [=51= 上查找(使用 obj.attrname 方案) ] 或 class 的实例,它会变成 method 对象。这个 method 对象本身就是一个可调用对象。如果查找发生在一个实例上,则该实例将 "magically" 作为函数的第一个参数插入。如果没有,您将必须自己提供(就像您对任何其他参数所做的那样)。

您可以阅读更多相关信息(以及 "magic" 是如何发生的:https://wiki.python.org/moin/FromFunctionToMethod

在你的例子中,你在 class 上查找函数,因此它需要两个参数(selfparam),但你只传递 param,因此错误。

您将 variable_Avariable_B 定义为 class 属性(将在 class 的所有实例之间共享的属性)。如果这确实是你的意图,并且你想要一个可以调用 class 本身并且能够访问 class 属性的方法,你可以将 functionA 设为 classmethod (它的工作原理与 "instance" 方法相同,除了它是 'magically' 作为第一个参数插入的 class:

class A(object):
  variable_A = 1
  variable_B = 2

  @classmethod
  def functionA(cls, param):
    return param + cls.variable_A

然后您可以直接在 class 本身上调用 functionA

print(A.functionA(42))

或者如果您手头有实例的话:

a = A()

# ...

print(a.functionA(42))

现在如果你真的想让 variable_Avariable_B 成为 per-instance 属性(A 的每个实例都有自己不同的变量),你需要 1/在初始化方法中在实例本身上创建这些属性,然后 2/ 在某些 A 实例上调用 functionA,即:

class A(object):
    def __init__(self, variable_A=1, variable_B=2):
        self.variable_A = variableA
        self.variable_B = variableB

  def functionA(self, param):
    return param + self.variable_A



a1 = A() # using default values
print(a1.functionA(42))

a2 = A(5) # custom value for variable_A
print(a2.functionA(42))
class A(object):
    variable_A = 1
    variable_B = 2

    def functionA(self, param):
        print(param+self.variable_A)

A().functionA(3)

A() 正在调用 class 来创建一个实例

4

[Program finished]

可以在函数中使用return,最后打印。 根据 OP 模板发布此答案,接受的答案和其他答案是推荐的方式。