抽象性
定义类主要是规定出其属性和行为。属性和行为是通过对同类对象的抽象分析得到的。属性和行为都是为对象准备的。
面向对象的编程语言都具有的特征
封装性
封装之后程序的安全性增加了,有些东西可以不被用户看到。修改类之后,只要涉及到此类的地方,都会发生改变。
对类的定义就是规定该类的属性和行为。
- 属性是描述所定义类的对象特征的若干变量
- 行为就是以函数形式能够对该类对象进行的操作
继承性
继承就是说和已有类(父类)相同的部分属性与行为从已有类中继承下来,在扩充定义新类(子类)额外需要的属性和行为即可。
如果要定义的新类的部分属性和已有类相同(比如老师和学生,都有一个相同的部分:人,可以把人的属性抽出来作为他们的父类),可以通过继承已有类的方式得到新类。
继承可以简化新类的定义,增强了代码的重用性。
多态性
类的部分特征具有多种状态。
人可以唱歌、睡觉。人的子类农民、教师、工人自然可以唱歌、睡觉。但是他们的唱歌方式可以不同,唱歌的种类也不同。在人的子类里面就可以再次定义唱歌的方式。这个叫做函数重载/函数多态
python中有加、减、乘、除四个运算,在我们的类里面就可以重新定义加、减、乘、除,比如说在我的类里面我可以定义学生+学生的计算方法为两名学生入学成绩的相加。这叫做运算符重载/运算符多态
面向对象与面向过程的区别
面向对象时,类里面的内容可见行可以设置。
- 数据操作更加安全
- 代码重用性更好
类和对象
类和对象的定义
类的使用需要通过对象完成
定义类的语法格式
class 类名:
定义数据成员(属性)
定义成员函数(行为)
类名必须由字母数字下划线组成,并且只能以下划线或者字母开头,严格区分大小写。一般首字母大写。多个单词组成的话,每个单词首字母都大写
定义对象的语法格式
对象=类名(实参表)
实参可加可不加
访问对象成员名的语法格式
对象名.成员
比如:张三.睡觉
定义类和对象示例
类里面,下划线越多,隐秘性越强
一个函数中定义的变量,不能在别的函数中使用,但是在类里面,一旦加上 self. 就表示这是整个对象的属性,不同函数之间可以调用
class Rect:
def __init__(self,le,wi): # self必须写,表示对象本身。括号中的名字除了self,在构造的时候都要写上
self.__length=le # 构造方法
self.__width=wi # self.__length、self.__width称为属性
def calArea(self): # 驼峰规则(第一个单词首字母不大写,后面每个单词的首字母大写),函数名以动词开头(潜规则)
return self.__length*self.__width
def calCircu(self):
return (self.__length*self.__width)*2
r1 = Rect(10, 5)
print(r1.calArea()) # 便可以获取r1的面积
构造函数与析构函数函数
构造函数
构造函数的做用是为对象的数据成员赋初值,函数名固定为__init__,其作用是为对象的数据成员赋初值,函数名固定,一般需要带若干个参数,第一个参数固定为self,代表当前对象。
除第一个参数外,其他参数可以带默认值
构造函数带默认值
def __init__(self, le=1, wi=1):
self.__length=le
self.__width=wi
通过定义方法修改参数
def setLength(self, length):
self.__length=length
def setWidth(self, width):
self.__width=width
改变数据成员值的函数与构造函数的区别
构造函数在定义对象时自动执行,用于给对象属性赋值,不能显式调用。
改变数据成员值的函数需要时显示调用
析构函数
删除类时默认执行,用于对象撤销时释放所占用空间。一般处于类的最后。
def __del__(self):
python中较少使用,主要是python有自身的自动内存管理功能,当系统发现某些对象不再使用,就会自动删除。
私有成员和共有成员
python中不同成员的性质体现在名字上
私有成员(private)两个下划线:只能在当前类中使用,其子类不能调用。
受保护的成员(protected)一个下划线:类本身和其子类都可以调用。
公有的的成员(public)无下划线:子类和对象成员都可以发现。
def calArea(self):
self.area=self.__length*self.__width
return self.area
经过上述定义,在输入r1.的时候就可以看到area,暴露出来就成为了属性,属性就可以被修改值。
在类外访问私有
在类外直接访问私有成员会报错,可以通过以下方法在类外直接访问私有成员:
对象名._类名__私有成员名
r1=Rect()
r1.calArea()
print(r1._Rect__area)
类成员和对象成员
在类内但在各成员函数之外定义的数据成员称为类成员,在成员函数内定义的变量称为对象成员,其中对象成员用的最多
存储方式
对象成员:每个成员单独存储
类成员:所有成员都存储在一个地方
数据成员访问示例
class Rect:
__total=0 # 类成员
def __init__(self, le, wi):
self.__length=le # 对象成员
self.__width=wi