2017-01-30 152 views
1

请看下面的简单例子。如何将参数传递给第一个参数为self的python函数?

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,在函数声明,我不能够访问的变量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 

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

+2

'A'是一类。你需要'A()'('A'的实例)。 – vaultah

回答

5

必须先创建类的实例的

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

您也可以使用'classmethod' –

+0

这是一个技术上正确的答案,但它不能解释任何事情...... –

1

先创建A的对象。

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

functionA你上面的代码片段是一个实例方法。你不会直接传递“自我”。相反,您需要创建一个实例才能使用它。实际上,函数的“自我”参数就是它所调用的实例。例如:

a = A() 
a.functionA(3) 

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

+0

O很简单。感谢您的解释。你能否告诉我为什么它能够在不创建对象的情况下调用函数?它是作为静态函数还是其他东西? –

+1

“以自身为第一个参数”(=>其第一个参数命名为“self”)的函数只是一个函数,其第一个参数恰好被命名为“self”。这并不是一个实例方法。使它成为实例方法的原因是作为该类的一个实例的类的一个属性。请阅读:https://wiki.python.org/moin/FromFunctionToMethod了解更多有关inners的内容。 –

+0

@brunodesthuilliers arg,这是非常糟糕的措辞,我同意。我会尽力编辑并纠正这一点。 – Mureinik

1

当一个函数对象(什么def语句创建)是一类的一种属性,它抬头(使用obj.attrname方案)的类或类的实例,它就会变成一个method目的。这个对象本身是可调用的。如果查找发生在一个实例上,这个实例将被“神奇地”插入为该函数的第一个参数。如果没有,你将不得不自己提供它(就像你对其他任何争论一样)。

你可以阅读更多关于这个(与“魔术”是如何发生在这里:https://wiki.python.org/moin/FromFunctionToMethod

在你的情况,你查找的类的功能,所以它需要两个参数(selfparam),但你只通过param,因此错误。

您将variable_Avariable_B定义为类属性(将在类的所有实例之间共享的属性)。如果这真的是你的意图,并且你想要一个方法,你可以调用这个类本身,并且可以访问类的属性,你可以使functionA a classmethod(它和“instance”方法一样,除了它是类是“神奇”插入作为第一个参数):

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每个实例都有它自己独特的变量),你需要在initialier方法和2 /调用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)) 
相关问题