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().
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绛洞花主敏明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值