繁体   English   中英

Python 3:从类中调用函数,self

[英]Python 3: Calling a Function from a class, self

我正在尝试学习类,有人可以向我解释为什么这段代码不起作用。 我想当从一个类中调用一个函数时,“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))

首先实例化该类:

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

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

您必须首先实例化该类:

d = test()

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

print(d.do(10))

如果你想静态使用方法,你必须在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

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

还有一件事:虽然它不是一个大问题,但如果你的所有类名都以大写字母开头,它会有所帮助,因为这通常是“pythonic”做事的方式,它也使你的代码更容易阅读因为当你第一次打电话给这个班级时,有人可能会把它误认为是一个普通的功能

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM