在Python中,self
是一个特殊的参数,通常在类的方法中使用。它表示类的实例本身,允许你在方法内部访问和操作实例的属性和方法。
首先定义这样一个类:
class A:
def ss():
print("ss")
a = A()
在python中定义类A的实例a
在python中,
如果运行实例a.ss() 在内部等同于 ss(a),实例a会作为入参传给方法ss()
如果直接调用类类方法A.ss(),则类A不会作为入参传给到方法ss()
因此如果运行
a.ss()
则会出现错误:
TypeError: A.ss() takes 0 positional arguments but 1 was given
这是因为a作为第一个参数传给了方法ss(),但ss方法却没有参数输入,因此我们需要给方法ss添加入参来接收调用它的实例
class A:
def ss(aa):
print("ss")
a = A()
a.ss()
此时再运行a.ss(),会在控制台打印"ss"
我们把aa换成self,就是约定俗成的self了
class A:
def ss(self):
print("ss")
a = A()
a.ss()
如果不喜欢self,可以使用 @staticmethod 装饰器告诉编译器这个是静态方法,调用该方法时不要把实例作为参数传入:
class A:
@staticmethod
def ss():
print("ss")
a = A()
a.ss()
由于self是用来接收调用实例的,对于类而言,则不需要self这个东西来接收参数了
class A:
def ss():
print("ss")
A.ss()
再看下面这个例子:
class A:
def ss(self):
print("ss")
def aa(self):
self.ss()
a = A()
a.aa()
实例a在调用方法aa()时,a会被参数self接收,再去调用方法ss(), 而方法ss()的self参数会接收方法aa()的self参数,所以a又被方法ss()的self参数接收,然后执行方法ss(),控制台输出"ss"。
总结:方法中定义self参数用来接收调用它的实例对象。而类直接调用则不用。