-
基本概念
- 结构化程序设计:结构化程序设计采用自顶向下,逐步求精的策略,把一个复杂问题的各种功能分解出来, 即把复杂问题逐步分解为一系列易于理解和实现的功能模块,这些一系列的功能模块主要由函数来具体实现,如C语言就是结构化程序设计语言。
- 面向对象程序设计:面向对象程序设计的主要特点有4个,抽象,封装,继承,多态。
抽象:所谓抽象就是将一系列具有相同属性和行为的对象,抽象出其共性从而形成类,而对象就是这个类的一个个的实例化个体,比如所有的小猫都具有毛色这种属性,其还具有舔毛这种行为,于是我们将具有毛色属性和舔毛行为的这种动物抽象出其共性从而形成猫类,当然猫不只有我前面提到的简单属性和行为,还有其它的属性和行为,这里不用钻牛角尖说具有毛色属性和舔毛行为的不止猫有,我只是简单的举例以便于理解,当然对猫类的划分并不如我上面举的例子那样简单;
封装:即把对象所具有的共同属性和行为集中到一个类中,并对使用者屏蔽其中的细节
继承:在现有类的基础上进行扩展构造出新的类, 被继承的类称为父类,在父类的基础上扩展出来的类称为父类的子类,子类继承了父类的所有属性和方法,在子类中可以对父类已有的功能进行改造,也可以扩展出新的功能和属性
多态:同样的函数对于不同对象可能具有不同的实现,典型的如运算符重载,对于运算符“+”而言,当其作用于数值类型时,其实现的是将两个数值进行加法运算,而当其作用于两个字符串时,其作用是将两个字符串进行合并形成一个更大的字符串,当其作用于两个列表时,其也是将两个列表合并形成一个更大的列表;如乘法运算符“*”也是当其作用于不同的对象时,其也具有不同的表现形式。
3.面向对象程序设计的特点:提高了代码的复用性,使程序的编程更加的灵活,便于代码的维护,提高了程序的可扩展性,提高了开发效率
类与对象
- 类:类是一种抽象,是将逻辑上相关连的数据和函数封装起来
- 对象:类的实例化结果称为对象,如地球上所有的人是一个类叫做人类,而我就是人类实例化的一个结果,所以我是人类这个类的实例化对象
- 属性:类中定义的变量叫做类的属性
- 方法:类中定义的函数叫做类的方法
类的定义
- python类的定义语法
class ClassName: 若干属性 若干方法
若干属性即类中定义的变量,若干方法即类中定义的函数,如下是圆类的定义
#例:一个关于圆形的类 class Circle(object): #Circle,类名 def __init__(self, radius): # 这是一个构造方法,用于初始化,初始化类对象的成员变量;python定义函数时需要用到关键字def self.radius = radius def area(self): #类方法 return 3.14159*self.radius*self.radius one_circle = Circle(2) #声明类对象,声明类对象时需要给构造函数进行传参,以便为创建的该实例化的对象进行成员变量的初始化 print('这个圆的面积是%f。' %one_circle.area())
python规定所有的类方法的第一个形式参数是实例化对象本身,并且约定俗将该形参定义为self,并不是强制性的,__init__函数是类的构造函数,其用于完成一些初始化操作,如初始化类的对象属性,或者类属性,有关类属性和对象属性的区别将会在下面提到;object是所有类的父类,即所有定义的类都继承于该object类。
-
对象的创建:如上例中的语句
one_circle = Circle(2)
就创建了一个圆类的对象one_circle,可以看到创建类的对象时需要给类的构造函数进行传参,让类的构造函数完成对象的创建,以及对象的初始化操作。
-
属性:构成类的主体的是类的属性和方法,类的属性分为类属性和对象属性,类属性是指定义在所有类方法之外的变量,而对象属性是指定义在类方法里面的变量
class Student: """学生类""" school='某大学' #类属性 school def __init__(self, x, myschool='五道口职业技术学院'): # 构造方法 ,用于完成类对象的创建以及一些成员属性的初始化工作 self.id = x #对象属性 id self.school = myschool #给类对象进行初始化操作,当对象被创建成功时起自动拥有全部的类属性,而类并不会拥有对象的属性 stu4=Student('20209527') #创建类对象时需要给类的构造函数传递参数以完成类对象属性的初始化工作以及类属性的初始化操作 print(stu4.id) print('类属性school=%s。' %Student.school) print('对象属性school=%s。' %stu4.school) Student.school='NUIST' print('赋值后类属性school=%s。' %Student.school)
如该例子中的school变量就是一个类属性,而变量id其定义在了__init__构造方法里面,只有当对象被创建的时候系统才会自动调用该构造函数,此时变量id才被创建,所以变量id是对象属性,self是指实例化对象本身,其指明了属性id属于实例化对象self。
-
构造方法和析构方法:构造方法又称为构造函数,当对象被创建的时候,系统将自动调用构造函数,完成对象的创建以及初始化操作,不需要程序员自己手动调用,定义形式:
def __init__(self,["形参列表"]) 函数体
与C++的构造函数不同,python的构造函数名字是"__init__",而C++的构造函数名字与类的名字一样,但是相同的是C++的构造函数也不需要程序员进行手动的显式调用而是在创建对象的时候由系统自动调用。析构函数:其作用是用于销毁对象本身,释放对象所占用的内存,定义语法:
def __del__(self) 函数体
可以看到python的析构函函数名字就叫做"__del__",与C++不一样,C++的析构函数名字是"~"加上类的名字,C++的析构函数没有形式参数,因此其不可以被重载,所以一个C++类有且仅有一个析构函数,python有优秀的内存回收机制,一般不需要程序员重新定义或者手动调用析构函数,当程序运行结束,或者python自动回收都会触发析构函数的调用。
类方法
类的方法分为三种类型:对象方法,类的静态方法,类方法
- 对象方法:对象方法是最常用的方法类型,对象方法是对象所具有的,在定义时其第一个形式参数必须是self,即对象本身 ,当通过对象来调用对象方法时并不需要给第一个形式参数传参,因为python会自动将对象与第一个形参绑定,而当通过类来对对象方法进行调用时必须给第一个形式参数传参,以告诉该函数是哪个对象调用该函数
class Student:, """学生类""" school='某大学' #类属性 school def __init__(self, x,myschool='五道口职业技术学院'): # 构造方法 self.id = x #对象属性 id self.school = myschool def show_id(self): print('对象方法,学号:'+ self.id) “+”在字符串类型中是用于进行两个字符串的连接操作 stu5=Student('20209527') stu5.show_id() Student.show_id(stu5)
以上的例子中的两条语句是等价的如
stu5.show_id() Student.show_id(stu5)
本质上都是对象stu5对象调用了方法show_id,如下是运行结果:
-
静态方法:静态方法与对象无关,不需要创建对象,可以直接通过类名来调用,由于静态方法和对象无关,所以静态方法的形参列表里面没有形式参数self,在静态方法的函数体里面也不可以通过self.属性名的方式访问类的属性,静态方法更像是定义在类里面的普通函数,定义静态方法时需要用关键字@staticmethod进行声明,如:
class MyClass(): @staticmethod def show_info(): print('静态方法.') MyClass.show_info()
如上就是一个静态方法的定义
-
类方法:类方法需要用关键字@classmethod来进行声明,类方法不需要创建对象,通过对象进行调用,可以直接通过类名进行调用,由于类方法不需要创建对象直接使用类名进行调用,所以类方法的形参列表中也没,有形式参数self,与对象方法相比较,其第一个形式参数不再是self,但是其第一个形式参数任然需要一个本类的对象作为其第一个形式参数,习惯上将该形式参数定义为cls,如下是一个类方法的定义的例子:
#带类方法的学生类 class Student: """学生类""" school='某大学' #类属性 school def __init__(self, x): self.id=x #对象属性 id def show_id(self): print('对象方法,学号:'+ self.id) @classmethod def show_info(cls): print('类方法,学校:'+ cls.school) Student.show_info()
类方法中第一个形式参数自动捆绑类本身,可以通过第一个形式参数来访问类属性。
封装与访问控制
-
封装:封装是指将数据和对数据的操作封装起来形成一个不可分割的主体, 对外只提供一系列的接口让用户只能访问一部分的数据,用户只关心该类所提供的功能而不关心具体的实现细节,所谓接口,就是一系列的函数,通过这些函数可以访问类的属性。
-
访问控制:由于要实现隐藏,只给用户看到我们想让其看到的信息,对于那些我们不想给用户看的信息进行隐藏保护是十分有必要的,在python中,类中的成员有三种访问权限,分别为,public,protected,private;public公有访问权限,可以在类外直接进行访问,protected,保护控制权限,不可以在类外通过对象直接访问,但是可以在其子类中被访问,private,私有访问权限,只能在类里面被访问,不能在类外被访问,包括在其子类里面也不可以访问该类的私有成员。在python类中默认的成员的访问控制权限是公有的,若要实现将一个成员的访问控制权限定义为受保护的只需要在该成员名字前面加“_”即可,若要实现将类成员设置成私有访问控制属性,只需要在该类成员的名字前加上符号"__"即双下滑线。与C++不同,C++是通过关键字public,protected,private,来声明成员的访问控制权限的,且C++的默认访问控制权限是私有的。