python中的self
python中的self代表类的实例,处理代码中可以使用self+“.”+类中的方法的方式调用函数。
self代表类的实例,并非类本身
例如:
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
执行结果如下
<__main__.Test object at 0x000000000284E080>
<class '__main__.Test'>
从上面的例子中可以很明显的看出,self代表的是类的实例。而self.__class__则指向类。
self不必非写成self
有很多童鞋是先学习别的语言然后学习Python的,所以总觉得self怪怪的,想写成this,可以吗?
当然可以,还是把上面的代码改写一下。
class Test:
def prt(this):
print(this)
print(this.__class__)
t = Test()
t.prt()
改成this后,运行结果完全一样。
当然,最好还是尊重约定俗成的习惯,使用self。
self可以不写吗
在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。
有兴趣的童鞋可以把上面的t.prt()一行改写一下,运行后的实际结果完全相同。
实际上已经部分说明了self在定义时不可以省略,如果非要试一下,那么请看下面:
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 <module>
t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given
当然,如果我们的定义和调用时均不传类实例是可以的,这就是类方法
情况一:
class Test:
def prt():
print(__class__)
Test().prt()
解释:
Test()是类的实例化,Test().prt()类实例化之后,调用类中的方法。
情况二:
class Test:
def prt():
print(__class__)
Test.prt(Test())
解释:
Test.prt(Test())中Test.prt()为调用类中的方法,其中参数Test()为实例化的对象。
情况三:
class Test:
def prt():
print(__class__)
t = Test()
t.prt()
解释:
情况与第一种情况相同。
情况四:
class Test:
def prt():
print(__class__)
t = Test
t.prt(Test())
解释:
情况与第二种情况相同。
类中的self.function()方法
问题一:类中相互调用function方法,使用class.function和self.function的方法有什么区别?
问题:
class test:
def eat(self):
print("lei eat")
def he(self):
print("lei he")
test.eat(self)
test().he()
输出:
lei he
lei eat
问题:
class test:
def eat(self):
print("lei eat")
def he(self):
print("lei he")
self.eat()
test().he()
输出:
lei he
lei eat
解释:
test.eat(self)
使用了类名test
,相当于调用类中的方法,并没有对类进行实例化,而方法eat
参数有self
,因此要使用test.eat(self)
的方式。- 或者使用
self.eat()
的方式,其中eat()
中没有参数self
,因为self
等价于对类test
的实例化。同时也等价于test().eat()
.
还没有评论,来说两句吧...