Python(面向对象)

1 面向对象

2 类的定义和使用

3 继承和重载

1 面向对象

  • 面向对象程序设计( Object Oriented Programming,OOP )的思想主要针对大型软件设计而提出,代码具有更好的可读性可扩展性,大幅度降低了软件开发的难度。
  • 面向对象程序设计中,程序的基本单元是。类是对具有相同属性和行为的一组实例的抽象, -一个类包含数据(描述类的属性)和方法(对数据的操作)两部分。
  • 面向对象程序设计的关键就是如何合理地定义这些类并且组织多个类之间的关系。
  • Python是面向对象的解释型高级动态编程语言,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的覆盖或重写。
  • 创建类时用变量形式表示对象特征的成员称为数据成员(attribute) **,用函数形式表示对象行为的成员称为成员方法( method) **, 数据成员和成员方法统称为类的成员。

类class:是一种自定义的数据类型

对象object:是该类型的一个实例数据

2 类的定义和使用

2.1 数据成员(属性成员)

  • 类数据成员:共有数据成员
  • 对象数据成员:实例属性成员
class Student:
    scount=0#类数据成员
    #对象数据成员,sno,sname,ssex
    def set(self,sno0,sname0,ssex0):#公有方法
        self.sno=sno0
        self.sname=sname0
        self.ssex=ssex0
        Student.scount+=1
    def display(self):#公有方法
        print('sno',self.sno,'sname',self.sname,'ssex',self.ssex)

stu1=Student()
stu1.set('190863113','XXXZhy','男')
stu1.display()

stu2=Student()
stu2.set('190863113','XXXZhy','男')
stu2.display()
#调用类名访问 类数据成员
print('数量:',Student.scount)
#调用对象名访问 类数据成员
print('数量:',stu1.scount)
print('数量:',stu2.scount)

【结果:】

sno 190863113 sname XXXZhy ssex 男
sno 190863113 sname XXXZhy ssex 男
数量: 2
数量: 2
数量: 2

2.2 方法

  • 专有方法:双划线开始,双下划线结束
  • 有方法:双下划线开始
  • 有方法:非双下划线开始

2.2.1 专有方法举例——构造方法

__init__,前后都是“双下划线”

在对象被创建时执行的一个特殊的专有方法。

如果有操作需要在对象被创建时执行,可以将代码放到这个方法中。

class Student:
    #对象数据成员,sno,sname,ssex
    def __init__(self,sno0='',sname0='',ssex0=''):#如果不='',stu2=Student()会报错
        self.sno=sno0
        self.sname=sname0
        self.ssex=ssex0
    def display(self):
        print('sno',self.sno,'sname',self.sname,'ssex',self.ssex)

stu1=Student('190863113','XXXZhy','男')#构造函数赋值要 一一对应
stu1.display()
stu2=Student()
stu2.display()

【结果:】

sno 190863113 sname XXXZhy ssex 男
sno  sname  ssex 

2.2.2 公有与私有——访问范围

公有:实例可用(任何地方)

私有:实例不可用(只能在类中使用),以__(双下划线)开始

class Score:
    #构造函数
    def __init__(self,sno,sname,slist):
        self.sno=sno
        self.sname=sname
        self.slist=slist
        self.aver=self.__average(slist)#私有函数,能在类中使用
    #平均成绩
    def __average(self,slist):#私有
        return int((slist[0]+slist[1]+slist[2]+slist[3])/4)
    #获取到平均成绩
    def getaver(self):
        return self.aver

    def display(self):
        print('sno',self.sno,'sname',self.sname,'score',self.slist)
        print('average:',self.aver)

stu1=Score('190863113','Zhy',[89,98,95,68])
stu1.display()
print(stu1.slist)
print('平均成绩:',stu1.getaver())#stu1无法调用__average私有函数

【结果:】

sno 190863113 sname Zhy score [89, 98, 95, 68]
average: 87
[89, 98, 95, 68]
平均成绩: 87

3 继承和重载

3.1 类的继承和方法的重载

父类(基类)→派生→子类(派生类)

父类(基类)←继承←子类(派生类)

class Student:
    #对象数据成员,sno,sname,ssex
    def __init__(self,sno0='',sname0='',ssex0=''):#如果不='',stu2.display()会报错
        self.sno=sno0
        self.sname=sname0
        self.ssex=ssex0
        print('调动Student类的构造函数')
    def display(self):
        print('sno',self.sno,'sname',self.sname,'ssex',self.ssex)

#Student派生GraStudent
class GraStudent(Student):
    def set(self,newno,newname,newsex,newdir):#如果不='',stu2.display()会报错
        self.sno=newno
        self.sname=newname
        self.ssex=newsex
        self.dir=newdir       
    def display(self):
        Student.display(self)
        #调用基类的方法,必须加上基类名和参数self
        print('direction',self.dir)

print('测试学生用例1')
stu1=Student('190863113','Zhy','男')
stu1.display()
print('测试学生用例2')
stu2=GraStudent()#如果不='',此句会报错
stu2.set('190863114','XXXZhy','女','人工智能')
stu2.display()

【结果:】

测试学生用例1
调动Student类的构造函数
sno 190863113 sname Zhy ssex 男
测试学生用例2
调动Student类的构造函数
sno 190863114 sname XXXZhy ssex 女
direction 人工智能

3.2 运算符重载

让自定义的类生成的对象(实例)能够使用运算符进行操作

方法 功能说明
__new__ 类的静态方法,用于确定是否要创建对象
__init__ 构造方法,创建对象时自动调用
__del__ 析构方法,释放对象时自动调用
__add__、__sub__ +、-
__mul__、__truediv__ *、/
__floordiv__ //整除
__mod__ %取模(求余)
__pow__ **(幂运算)
__eq__、__ne__ ==、!=
__lt__、__le__ <、<=
__gt__、__ge__ >、>=

例子:

class Vector:
    def __init__(self,a0,b0):
        self.a=a0
        self.b=b0    
    def print_vector(self):
        print('Vector(%d,%d)'%(self.a,self.b)) 
    def __add__(self,other):
        return Vector(self.a+other.a,self.b+other.b)
    def __sub__(self,other):
        return Vector(self.a-other.a,self.b-other.b)
    def __mul__(self,other):
        return Vector(self.a*other.a,self.b*other.b)

v1=Vector(3, 8)
v2=Vector(1, 9)
v=v1+v2
v.print_vector()
v=v1-v2
v.print_vector()
v=v1*v2
v.print_vector()

结果:

Vector(4,17)
Vector(2,-1)
Vector(3,72)
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

客官,赏一瓶怡宝吧。

支付宝
微信