采用以下简化示例。
#!/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'
,在函数声明中,我无法访问类中的变量self
和variable_A
,我收到以下错误< / p>
variable_B
那么,我如何访问类变量而不是在这里得到param错误? 我正在使用Python 3 FYI。
答案 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
在您的情况下,您在类上查找函数,因此它需要两个参数(self
和param
),但您只传递param
,因此错误。
您将variable_A
和variable_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_A
和variable_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 模板发布此答案,建议采用已接受的答案和其他答案。