python中的self参数(python中self用法详解)

python中的self参数(python中self用法详解)

一、self代表类的实例二、self 举例三、self用法详解

一、self代表类的实例self代表类的实例,而非类。classTest:defprt(self):print(self)print(self.__class__)t=Test()t.prt()”’从上面的例子中可以很明显的看出,self代表的是类的实例。而self.class则指向类。<__main__.Testobjectat0x000001C467408D68><class’__main__.Test’>”’如果定义和调用时均不传类实例是可以的,就是类方法。classTest:defprt():print(__class__)Test.prt()”'<class’__main__.Test’>”’在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。运行c.cprt()时应该没有理解问题,指的是Child类的实例。但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。classParent:defpprt(self):print(self)classChild(Parent):defcprt(self):print(self)c=Child()c.cprt()c.pprt()p=Parent()p.pprt()”'<__main__.Childobjectat0x000001CDA16F50B8><__main__.Childobjectat0x000001CDA16F50B8><__main__.Parentobjectat0x000001CDA16F5128>”’

总结

self在定义时需要定义,但是在调用时会自动传入。

self的名字并不是规定死的,但是最好还是按照约定是用self

self总是指调用时的类的实例。

二、self 举例

类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都相互独立、互不影响;方法是与实例绑定的函数,和普通的函数不同,方法可以直接访问实例的数据

其实 self 中存储的是 实例变量 和 实例函数 的属性,可以理解为一个字典( dict ),如:{‘name’:’zhang’,’age’:’18’}就是这些。

classUser(object):def__init__(self,name,age):self.name=nameself.age=agedefSetName(self,name):self.name=namedefSetAge(self,age):self.age=agedefGetName(self):returnself.namedefGetAge(self):returnself.ageu=User(‘kzc’,17)print(u.GetName())print(u.GetAge())”’kzc17”’三、self用法详解

self 参数的具体作用是什么呢?打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。

也就是说,同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python 会自动绑定类方法的第一个参数指向调用该方法的对象。如此,Python解释器就能知道到底要操作哪个对象的方法了。

classBox(object):def__init__(self,boxname,size,color):self.boxname=boxnameself.size=sizeself.color=color#self就是用于存储对象属性的集合,就算没有属性self也是必备的defopen(self,myself):print(‘–>用自己的myself,打开那个%s,%s的%s’%(myself.color,myself.size,myself.boxname))print(‘–>用类自己的self,打开那个%s,%s的%s’%(self.color,self.size,self.boxname))defclose(self):print(‘–>关闭%s,谢谢’%self.boxname)b=Box(‘魔盒’,’14m’,’红色’)b.close()b.open(b)#本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。print(b.__dict__)#这里返回的就是self本身,self存储属性,没有动作。”’–>关闭魔盒,谢谢–>用自己的myself,打开那个红色,14m的魔盒–>用类自己的self,打开那个红色,14m的魔盒{‘boxname’:’魔盒’,’size’:’14m’,’color’:’红色’}”’

classBox(object):defmyInit(mySelf,boxname,size,color):print(mySelf.__dict__)#显示为{}空字典mySelf.boxname=boxnamemySelf.__dict__[‘aa’]=’w’#甚至可以像字典一样操作mySelf.size=sizemySelf.color=color#自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准selfreturnmySelf#返回给实例化过程一个对象!神奇!并且含有对象属性/字典#def__init__(self,boxname,size,color):#self.boxname=boxname#self.size=size#self.color=color#注释掉原来标准的初始化defopen(self,myself):print(self)print(‘–>用自己的myself,打开那个%s,%s的%s’%(myself.color,myself.size,myself.boxname))print(‘–>用类自己的self,打开那个%s,%s的%s’%(myself.color,myself.size,myself.boxname))defclose(self):print(‘–>关闭%s,谢谢’%self.boxname)#经过改造,运行结果和标准初始化没区别b=Box().myInit(‘魔盒’,’14m’,’红色’)#b=Box(‘魔盒’,’14m’,’红色’)#注释掉原来标准的初始化方法b.close()b.open(b)#本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。print(b.__dict__)#这里返回的就是self本身,self存储属性,没有动作。”'{}–>关闭魔盒,谢谢<__main__.Boxobjectat0x000002DA36AE9668>–>用自己的myself,打开那个红色,14m的魔盒–>用类自己的self,打开那个红色,14m的魔盒{‘boxname’:’魔盒’,’aa’:’w’,’size’:’14m’,’color’:’红色’}”’

发表评论

登录后才能评论