您的位置 首页 > 德语词汇

self是什么意思?用法、例句?读懂python中的self

今天给各位分享self是什么意思?用法、例句的知识,其中也会对读懂python中的self进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

self是什么意思?用法、例句?读懂python中的self

一、self的作用

self指的是调用该函数的对象(是一个实例)。Python中self等价于Java中的this。

首先明确的是self只有在类中的方法中才会有,独立的函数或方法是不必带有self的。

#定义方法\ndefshowTime(name):\nprint(f'大家好我是{name},多多关照!')\n\n#调用方法\nshowTime('齐天大圣')\n\n"""\n输出结果:\n大家好我是齐天大圣,多多关照!\n"""

二、self的使用注意事项

#self代表类的实例,而非类\nclassTestDemo():\n#可将self理解为实例td\ndeftestFn(self):\nprint(f"谁调用我我就是谁,此时调用我的是{self}")\n#实例调用__class__属性时会指向该实例对应的类\nprint(f"我是按照{self.__class__}创建出来的")\n#td为TestDemo的实例\ntd=TestDemo()\n#在类中方法的形参中,self参数一定要定义,但是在调用时会自动传入。\ntd.testFn()

执行结果如下:

谁调用我我就是谁,此时调用我的是<__main__.TestDemoobjectat0x00000000028836C8>\n我是按照<class'__main__.TestDemo'>创建出来的\n

说明:

<__main__.TestDemoobjectat0x00000000028836C8>表示:self是一个TestDemo类型的object(对象),对象在内存的地址为0x00000000028836C8。

为什么self指的是类的实例对象,而不是类本身。

如果self指向类本身,那么当一个类有多个实例对象时,self指向哪一个呢?

2、self不必非写成self,只是一种规范。

有很多人先学习别的语言,如Java,然后再学习Python的,所以总觉得self怪怪的,想写成this,可以吗?当然可以,换成任何标识符都可以,把上面的代码改写一下。

#self代表类的实例,而非类\nclassTestDemo():\n#可将self理解为实例td\ndeftestFn(this):\nprint(f"谁调用我我就是谁,此时调用我的是{this}")\n#实例调用__class__属性时会指向该实例对应的类\nprint(f"我是按照{this.__class__}创建出来的")\n#td为TestDemo的实例\ntd=TestDemo()\n#在类中方法的形参中,self参数一定要定义,但是在调用时会自动传入。\ntd.testFn()

执行结果如下:

谁调用我我就是谁,此时调用我的是<__main__.TestDemoobjectat0x00000000028836C8>\n我是按照<class'__main__.TestDemo'>创建出来的

改成this后,运行结果完全一样。当然,最好还是尊重约定俗成的习惯,使用self。(不是最好,是一定。)

3、类中方法的形参中一定要写self,包括内置函数

#如果类中的方法不写self形参,\n#则不能使用对象.方法名()来调用方法,\n#只能使用类名.方法名()的方式来调用该方法,\n#类似与Java中的静态方法。\n\nclassTestDemo():\n#定义一个方法,不定义self形参\ndeftestFn():\nprint(f"不定义形参self,依旧可以调用我")\nprint(__class__)\n\n#创建对象,用对象.方法名()来调用方法\ntd=TestDemo()\n#报错\n#TypeError:testFn()takes0positionalargumentsbut1wasgiven\ntd.testFn()\n\n#只能使用类名.方法名()的方式来调用该方法。\nTestDemo.testFn()

4、__init__函数中,要把接收到的参数赋值到self中,提供全类使用

关于__init__函数,可以查看Python的魔法方法来了解。

classStudent():\ndef__init__(self,name,age,addr):\n#self的作用主要表示这个变量是类中的公共变量\n#定义在self中的属性,整个类内都可以使用\n#普通方法同理\nself.name=name\nself.age=age\n#没有定义在self中的属性,只能在当前方法内使用\naddr=addr\n#标准用法\ndeftellMeName(self):\n#如果去掉此处的self,会提示name'name'isnotdefined\nprint(f'我不叫孙悟空,我叫{self.name}')\n#方法形参没有定义self,则报错\n#TypeError:tellMeAge()takes0positionalargumentsbut1wasgiven\n#deftellMeAge():\ndeftellMeAge(self):\n#如果获取age的值不加self,则获取不到,会报错\n#NameError:name'age'isnotdefined\n#print(f'我今年{age}啦')\nprint(f'我今年{self.age}啦')\ndeftellMeAddr(self):\n#因为__init__函数汇总没有把addr变量定义在self对象中\n#所以addr变量的作用域只在__init__函数内,\n#其他函数无法调用。\n#添加在self对象内的属性为全局属性。\nprint(f'我现居住在{self.addr}')\ns=Student('美猴王',18,addr='北京')\ns.tellMeName()\ns.tellMeAge()\ns.tellMeAddr()

5、同一个类中调用其他的方法时需要加self

classStudent():\ndef__init__(self,name,age,addr):\n#self的作用主要表示这个变量是类中的公共变量\n#定义在self中的属性,整个类内都可以使用\n#普通方法同理\nself.name=name\nself.age=age\nself.addr=addr\ndeftellMeName(self):\nprint(f'我不叫孙悟空,我叫{self.name}')\ndeftellMeAge(self):\nprint(f'我今年{self.age}啦')\ndeftellMeAddr(self):\nprint(f'我现居住在{self.addr}')\ndeftellAll(self):\n#如果调用类中的其他函数时,不用self调用,则会报错\n#NameError:name'tellMeName'isnotdefined\n#tellMeName()\nself.tellMeName()\nself.tellMeAge()\nself.tellMeAddr()\n\ns=Student('美猴王',18,addr='北京')\ns.tellAll()\n"""\n输出结果:\n我不叫孙悟空,我叫美猴王\n我今年18啦\n我现居住在北京\n"""

6、self总是指调用时的类的实例,在继承时中也一样。

看完面向对象继承的内容可以回来再看。

#定义一个父类\nclassParent():\ndefpFn(self):\nprint(self)\n#定义一个子类\nclassChild(Parent):\ndefcFn(self):\nprint(self)\n#创建子类对象\nchild=Child()\n#调用子类方法\n#<__main__.Childobjectat0x00000000025A38C8>\nchild.cFn()\n#子类调用父类方法\n#<__main__.Childobjectat0x00000000025A38C8>\nchild.pFn()\n#创建父类\nparent=Parent()\n#调用自己方法\n#<__main__.Parentobjectat0x00000000025A3908>\nparent.pFn()

7、self与私有变量的用法

看完私有变量的内容可以回来再看。

#self的属性名称前加上两个下划线,就变成了一个私有变量(private)\n#只有类内部可以访问,外部不能直接访问\nclassStudent():\ndefsetname(self,name1,name2):\nself.name1=name1\nself.__name2=name2\n\ndefgetname(self):\nprint(f'我的第一个名字是{self.name1},我的第二个名字是{self.__name2}')\nstu=Student()\nstu.setname("齐天大圣","美猴王")\n#结果:我的第一个名字是齐天大圣,我的第二个名字是美猴王\nstu.getname()\n\n#结果:齐天大圣\nprint(stu.name1)\n#结果报错:AttributeError:'Student'objecthasnoattribute'name2'\n#说明私有变量并不能获取到\nprint(stu.name2)

8、总结:

self的名字并不是规定死的,但是在Python中self不是关键词,你可以定义成this、abc或其它名字都可以。但是约定成俗,减少代码理解难度。

在类中方法的形参中,self参数一定要定义,但是在调用时会自动传入。

#需求:洗衣机,功能:能洗衣服\n\n#1.定义洗衣机类\nclassWasher():\ndefwash(self):\nprint('我会洗衣服')\nprint(self)\n\n#2.创建对象\nhaier1=Washer()\n#<__main__.Washerobjectat0x0000000002553508>\nprint(haier1)\n#haier1对象调用实例方法(对象方法)\nhaier1.wash()\n\n#3.创建第二个对象\nhaier2=Washer()\n#<__main__.Washerobjectat0x0000000002553608>\nprint(haier2)\nhaier2.wash()\n"""\n输出结果:\n<__main__.Washerobjectat0x00000000025A3688>\n我会洗衣服\n<__main__.Washerobjectat0x00000000025A3688>\n<__main__.Washerobjectat0x00000000025A3788>\n我会洗衣服\n<__main__.Washerobjectat0x00000000025A3788>\n"""\n"""\n可以看到每创建一个新的对象,都是有独立空间的对象,\n所以每个对象的地址是不同的。\n"""

注意:

可以看到每创建一个新的对象,都是有独立空间的对象,因为每个对象的地址是不同的。

每次打印对象和self得到的结果是一致的,说明self指向了对象的实例

OK,本文到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023