当前位置: 首页 > 后端技术 > Python

Python的面向对象编程

时间:2023-03-25 20:50:32 Python

面向对象:ObjectOrientedProgramming,简称OOP,即面向对象编程。类(Class)和对象(Object)类用来描述具有相同属性和方法的对象的集合。对象是类的具体实例。例如,如果学生有姓名和分数,那么姓名和分数就是公共属性。这时候可以设计一个班级,记录学生的名字和分数。这里是对属性和方法的解释Attributes:属性,用来描述所有对象共有的属性,比如学生的名字和分数。方法:方法,类中包含的函数,也叫类函数,区别于类外的函数,用来实现某些功能,比如打印出学生的姓名和分数等。使用关键字class创建一个类classStudent():def__init__(self,name,score):self.name=nameself.score=scoredefout(self):print("%s:%s"%(self.name,self.score)上面的例子中只定义了一个类,计算机并没有创建存储空间,只有在类被实例化的时候才能创建该类的具体对象并为其分配存储空间。所以,对象就是类的实例,接下来创建对象只需要添加两行代码即可实现Student1=Student('Anny','100')Student2=Student('Mike','90')得了吧,Student是一个类,student1和student2是这个类创建的具体对象。当有上述代码时,Python会自动调用init初始自构造函数来创建具体对象。关键字self是a很重要的参数,代表函数本身的创建,创建具体对象后,可以通过Student1.name和Student1.score获取学生姓名和分,也可以直接调用Student1.out()方法获取所有信息。类变量和实例变量假设现在需要增加一个计数器,每增加一个学生,计数器就加1。这个计数器不属于某个学生,而是属于班级的属性,所以称为班级。而名字和分数属于每个A学生,所以称为实例变量,也称为对象变量。通常,像这样添加一个计数器Student():number=0def__init__(self,name,score):self.name=nameself.score=scorenumber=number+1defshow(self):print("%s:%s"%(self.name,self.score))student1=Student('Anny',100)student2=Student('Mike',90)print(student1.name)其中number是一个类变量,所以放在方法外面,name和score是实例变量,所以放在方法里面。类变量和实例变量有很大区别,访问方式也不同。类变量:类变量,类变量在整个实例化对象中是通用的,类变量定义在类中,函数体之外。访问或调用类变量的具体方法是classname.variablename,或者self.class.variablename,self.class.automatically返回每个对象的classname。实例变量:实例变量,函数内部定义的变量,属于一个特定的对象,访问或调用实例变量的方法是对象名.变量名,或自身.变量名。执行以上代码会报错UnboundLocalError:localvariable'number'referencedbeforeassignment然后使用Student.number或self.class.number修改如下:classStudent():number=0def__init__(self,name,score):self.name=nameself.score=scoreStudent.number=Student.number+1defshow(self):print("%s:%s"%(self.name,self.score))student1=Student('Anny',100)student2=Student('Mike',90)student1.show()print(student2.number)类方法有些变量只属于类,有些方法只属于类,不具体对象。不难发现,在属于对象的方法中有self参数,如init(self)、show(self)等,而在类中,则使用cls,与self类似。它代表类本身,一般会加上@classmethod修饰符来说明。这里使用自定义类方法打印学生人数classStudent():number=0def__init__(self,name,score):self.name=nameself.score=scoreStudent.number=Student.number+1defshow(self):print("%s:%s"%(self.name,self.score))@classmethoddefpeople(cls):print("总共有%s个学生"%Student.number)student1=Student('Anny',100)student2=Student('Mike',90)student1.show()student2.show()Student.people()类的私有属性和私有方法是私有属性和私有类中的方法以双下划线__开头的私有属性和方法不能在类外直接使用或访问。把score改成私有属性,然后print(Student.score),会发现报错。但是调用show不会报错。这是因为show是类中的函数,所以可以访问私有变量。私有方法也是如此。值得注意的是,私有方法必须包含一个self参数,并将其作为第一个参数。在面向对象编程中,外部类通常很少直接访问类内部的属性和方法,而是提供一些按钮让外部访问其内部成员,以保证程序的安全性。这称为封装。@propertydefscores(self):print("学生的分数是%s"%self.score)加装饰器后可以直接调用,不用加括号。类继承面向对象编程的最大优点是避免重复代码,即重复使用一段代码。其中一种方法是继承。先定义一个基类或父类,然后通过类类名(父类):pass创建子类,使子类获得父类的所有属性和方法。这种现象称为继承。再写一段代码,用Schoolmember代表父类,name和age是每个人的属性,但是teachers有salary的专属属性,students有score的专属属性:def__init__(self,name,age):self.name=nameself.age=agedeftell(self):#打印个人信息print('Name:"{}"Age:"{}"'.format(self.name,self.age),end="")#创建子类teacherTeacherclassTeacher(SchoolMember):def__init__(self,name,age,salary):SchoolMember.__init__(self,name,age)#使用父类初始化self.salary=salary#方法重写deftell(self):SchoolMember.tell(self)print('Salary:{}'.format(self.salary))#创建子类StudentStudentclassStudent(SchoolMember):def__init__(self,name,age,score):SchoolMember.__init__(self,name,age)self.score=scoredeftell(self):SchoolMember.tell(self)print('score:{}'.format(self.score))teacher1=Teacher("约翰",44,"$60000")student1=Student("玛丽",12,99)teacher1.tell()#打印姓名:"John"年龄:"44"薪水:$60000student1.tell()#Name:"Mary"Age:"12"score:99从上面的代码不难看出,在创建子类的过程中,需要手动调用类的构造函数init父类完成子类的创建。在子类中调用父类的方法时,需要以父类的类名为前缀,并且必须包含self参数变量。示例SchoolMember。告诉(自己)。如果子类调用每一个方法或者属性,Python都会先在父类中查找,如果找不到,就会去子类中查找。==在实际项目中,一个子类可以继承多个父类。==使用super()关键字调用父类。在子类中,可以使用super关键字直接调用父类中的属性或方法,简化了代码,也体现了短暂的生命。为此,我使用Python。#创建子类学生StudentclassStudent(SchoolMember):def__init__(self,name,age,score):SchoolMember.__init__(self,name,age)self.score=scoredeftell(self):super().tell()#等同于SchoolMember.tell(self)print('score:{}'.format(self.score))上面例子中student子类调用了父类的tell方法,相当于SchoolMember.tell(self),用super关键字调用时,需要去掉括号中的self。本次分享到此结束,如果对你有帮助,请在离开前点个赞~谢谢阅读。