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

时间:2017-01-30 11:51:24

标签: python function python-3.x self

采用以下简化示例。

#!/bin/sh
if ( when "pbpaste" command has been launched by user )
then
do something
fi

在上面的示例中,我收到以下错误

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' ,在函数声明中,我无法访问类中的变量selfvariable_A,我收到以下错误< / p>

variable_B

那么,我如何访问类变量而不是在这里得到param错误? 我正在使用Python 3 FYI。

5 个答案:

答案 0 :(得分:8)

您必须先创建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))

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

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

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

print(A.functionA(3))

另一种选择是使用classmethod装饰器。 类方法是不绑定到对象的方法,而是绑定到类!

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

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

print(A.functionA(3))

答案 1 :(得分:2)

上面代码段中的

functionA是一个实例方法。你没有通过&#34; self&#34;直接到它。相反,您需要创建一个实例才能使用它。 &#34; self&#34;事实上,函数的参数是它所调用的实例。 E.g:

a = A()
a.functionA(3)

P.S。 请注意,您的functionA来电print但未返回任何内容,这意味着它会隐式返回None。您应该让它返回一个值并从调用者打印它,或者,如上所述,调用它并让它自己打印。

答案 2 :(得分:1)

首先创建A的对象。

a = A()
a.functionA(3)

答案 3 :(得分:1)

当一个函数对象(def语句创建的内容)是类的属性并且在类或类的实例上查找(使用obj.attrname方案)时,它会得到变成了一个method对象。这个method对象本身是可调用的。如果查找发生在一个实例上,那么这个实例将是一个神奇的&#34;作为函数的第一个参数插入。如果没有,你必须自己提供(就像你对任何其他论点一样)。

你可以阅读更多相关内容(以及&#34;魔法&#34;在这里发生的事情:https://wiki.python.org/moin/FromFunctionToMethod

在您的情况下,您在类上查找函数,因此它需要两个参数(selfparam),但您只传递param,因此错误。

您将variable_Avariable_B定义为类属性(将在类的所有实例之间共享的属性)。如果这真的是意图,并且您想要一个可以调用类本身并且能够访问类属性的方法,则可以使functionA成为classmethod(它可以正常运行与&#34;实例&#34;方法相同,除了它是作为第一个参数被神奇地插入的类:)

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

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

然后你可以直接在课堂上调用functionA

print(A.functionA(42))

或在某个实例上,如果您已经有一个:

a = A()

# ...

print(a.functionA(42))

现在,如果您真的希望variable_Avariable_B成为每个实例的属性(A的每个实例都拥有它自己的不同变量),那么您需要1 /在初始化方法中为实例本身创建这些属性,并在某个functionA实例上调用A,即:

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))

答案 4 :(得分:0)

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

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

A().functionA(3)

A() 正在调用类来创建实例

4

[Program finished]

您可以在函数中使用 return ,然后最后打印。 根据 OP 模板发布此答案,建议采用已接受的答案和其他答案。