对Python中class和instance以及self的用法详解
一.Python的类和实例
在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”。
就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个Student类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象,每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫hansry的学生,其分数为93,身高为176,则这个实例拥有具体的数值。
1.类:以Student类为例,在Python中,定义类如下:
classStudent(object): def__init__(self,name,score): self.name=name self.score=score
a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。yt
b.__init__方法的第一参数永远是self,用来表示类创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self本身就是指向创建的实例本身。
c.有了__init__方法后,在创建实例的时候,就不能传入空参数,必须传入与__init__方法匹配的参数,但self本身不需要传入参数,只需要传入self后面的参数即可。
2.实例:定义好了类后,就可以通过Student类创建出Student的实例,创建实例是通过类名+()实现:
student=Student('name',93) >>>student.name "name" >>>student.score 93
a.其中Student是类名称,('name',93)为要传入的参数
b.self.name就是Student类的属性变量,为Student类所有。同时,name是外部传来的参数,不是Student类所自带的。故self.name=name的意思就是把外部传来的参数name的值赋值给Student类自己的属性变量self.name.
3.和普通函数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没有啥区别。既可以用默认参数、可变参数或者关键字参数等。
二.类以及实例的访问
1.限制外部对类实例属性的访问
既然Student类实例本身就拥有这些属性的数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以在类的内部定义访问数据的函数,这样,就可以把”数据“封装起来了。这些封装数据的函数和Student类本身是相关联的,称之为类的方法:
classStudent(obiect): def__init__(self,name,score): self.name=name self.score=score defprint_score(self): print"%s:%d"%(self.name,self.score)
>>>student=Student("hansry",99) >>>student.print_property() hansry:99
由此可见,从外部看Student类,我们只知道创建实例需要给出name和score。究竟如何打印,是Student类内部定义的,这些数据和逻辑被封装起来了,调用也就变得容易了,但是不知道内部实现的细节。
如果不想让实例中的内部属性被外部属性访问,则把name和score变成__name和__score即可,如下代码所示:
classStudent(object): def__init__(self,name,score): self.__name=name self.__score=score defprint_property(self): print"%s:%d"%(self.__name,self.__score)
>>>student=Student("hansry",99) >>>student.print_property() >>>student.__name() hansry:99 Traceback(mostrecentcalllast): AttributeError:'Student'objecthasnoattribute'__name'
2.开API使得外部代码能够访问到里面的属性,并且对其进行修改
外部代码访问到类实例属性,代码如下:
def__init__(self,name,score): self.__name=name self.__score=score defprint_property(self): print("%s:%d"%(self.__name,self.__score)) defget_name(self): returnself.__name defget_score(self): returnself.__score
name=student.get_name() score=student.get_score() print("%s,%d"%(name,score))
外部代码修改类里面的实例属性,代码如下:
def__init__(self,name,score): self.__name=name self.__score=score defprint_property(self): print("%s:%d"%(self.__name,self.__score)) defreset_name(self,change_name): self.__name=change_name defreset_score(self,change_score): self.__score=change_score
student=Student("hansry",99) student.print_property() student.reset_name("simona") student.reset_score(91) name=student.get_name() score=student.get_score() print("%s:%d"%(name,score)) hansry:99 simona:91
需要注意的是,在Python中,变量名类似_xxx_的,也就是双下划线开头,并且以下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,不能用__name__,__score__。
三.self的仔细用法
1.self代表类的实例,而非类。
classStudent(object): defprint_self(self): print(self) print(self.__class__)
student=Student() student.print_self() <__main__.Studentobjectat0x7fd9095aed90>
从上面例子可得,self代表的只是类的实例,而self.__class__才是类。
2.定义类的时候,self最好写上,因为它代表了类的实例。
3.在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。
classTeacher(object): def__init__(self,teacher): self.teacher=teacher print(self.teacher) defprint_self(self): print(self) classStudent(Teacher): def__init__(self,student): self.student=student print(self.student) defprint_self_1(self): print(self)
teacher=Teacher("hansry") student=Student("simona") student.print_self_1() student.print_self() hansry simona <__main__.Studentobjectat0x7fd9095b0950> <__main__.Studentobjectat0x7fd9095b0950>
在运行student.print_self()的时候,这里是调用了类Teacher的print_self()函数,此时虽然调用的是类Teacher的函数,但是此时的实例self确是类Student实例化时生成的。
以上这篇对Python中class和instance以及self的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。