我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~
任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~
今天在写代码的时候发现某个类的方法:def xx() 中没有加上self,运行后提示的错误很有意思,大意是提供了一个参数但却定义了0个参数。后来查了下资料大概了解了self的作用,下面一起来看看:
不加self是本地变量,只在这个方法里有效;加self则是实例变量。因此,类里没有加self.的属性是全局的,所有的实例化出来的对象都访问到同一个
来看一个简单例子:
class A:
def fun():
pass
# 这种就是静态函数,一般用装饰器 @staticmethod 修饰
class B:
def fun1(self):
pass
# 这种就是成员函数,类实例可以直接调用
@classmethod
def fun():
pass
# 这种是类函数,要求第一个参数表示类( cls )。也就是说,除了装饰器 @classmethod 外,还要求它的定义如 def fun(cls,...)。这是通过类直接调用的,如 A1.fun(...)
在Python的解释器内部,当我们调用X.fun()时,实际上Python解释成X.fun(self),也就是说把self替换成类的实例。有兴趣的可以把上面的一行改写一下,运行后的实际结果完全相同。实际上已经部分说明了self在定义时不可以省略,如果非要试一下,那么请看下面:
class Test:
def prt():
print(self)
t = Test()
t.prt()
1
2
3
4
5
6
class Test:
def prt():
print(self)
t = Test()
t.prt()
运行时提醒错误如下:prt在定义时没有参数,但是我们运行时强行传了一个参数。由于上面解释过了t.prt()等同于Test.prt(t),所以程序提醒我们多传了一个参数t。
Traceback (most recent call last):
File "h.py", line 6, in
t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given
1
2
3
4
Traceback (most recent call last):
File "h.py", line 6, in
t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given