3

我正在尝试学习课程,有人可以向我解释为什么这段代码不起作用。我想当从一个类中调用一个函数时,“self”会被自动省略,但是解释器告诉我参数“a”丢失了(他认为 self = 10)。

#! coding=utf-8
class test:
    def __init__(self):
        "do something here"
    def do(self,a):
        return a**2

d = test.do
print(d(10))
4

5 回答 5

10

首先实例化类:

d = test().do
print(d(10))  # prints 100

test.do是一个未绑定的方法,test().do是绑定的。此线程中解释了差异:Python 中的类方法差异:绑定、未绑定和静态

于 2013-08-30T12:16:46.120 回答
3

您必须先实例化该类:

d = test()

然后你可以调用一个方法:

print(d.do(10))
于 2013-08-30T12:16:41.033 回答
2

如果你想静态使用方法,你必须在 python 中声明它

#! coding=utf-8
class test:
    def __init__(self):
        "do something here"

    @staticmethod
    def do(a):
        return a**2

d = test.do
print(d(10)) #and that's work
于 2013-08-30T12:29:28.850 回答
0
class test:
    def __init__(self):
        "do something here"
    def do(self,a):
        return a**2
    def __call__(self,a):
        return self.do(a)

a = test
test.do(a,10)
#or
a = test().do
a(10)
#or
a = test()
test.do(a,10)
#or
a = test()
print(a(10))
于 2014-08-12T05:43:19.877 回答
0

由于您还没有实例化类(创建的一个花哨的术语),您不能将方法分配给任何随机变量。就像已经说过的,您必须首先创建对象,同时确保您调用的方法是您调用的类的一部分或以某种方式连接到该类(例如创建另一个类,然后将该类与当前类通信) . 所以你应该先输入d=test() ,然后是d.do(). 另外,请记住,在您声明的方法中,您创建了一个参数,所以无论如何您所做的事情本身就是错误的,因为当您声明 do 函数时,您应该将要发送给方法以计算的数字放在括号内它的广场。所以你输入test.do(10)然后 10 通过自引用发送到要完成的方法,无论您告诉它做什么。

还有一件事:虽然这不是什么大问题,但如果你的所有类名都以大写字母开头,它会有所帮助,因为这通常是“pythonic”的做事方式,而且它也使你的代码更容易阅读, 因为当你第一次调用这个类时,有人很容易把它误认为是一个普通的函数

于 2013-08-30T13:45:52.493 回答