面向过程/对象
举个栗子
面向过程:按照逻辑业务,从上到下写代码
比如说现在开学了学生们要进行自我介绍,写一个程序去介绍,根据学生的信息然后最后定义一个过程来完成这个自我介绍的任务;再比如说,杀龙,那首先我们要找杀龙的武器,谁去杀龙,杀龙的过程要怎么杀,最后完成杀龙的任务。这是都是面向过程,面向过程的时候你整个过程都得设计清楚,不能有一个过程有出错,不然程序就无法运行下去。
面向对象:将数据和函数绑在一起,进行封装,更快的开发程序,减少了重复代码的重复书写过程。
面向对象就是,现在要自我介绍,你叫同学自己站起来自我介绍就行,你也不用给他规定模板怎么介绍,他自己介绍就可以。杀龙也不用自己想着怎么杀,你要想的就是谁能杀龙让他去杀,完成这个杀龙的任务就行。也就是面向哪个对象。
面向对象和面向过程仅仅是一种解决问题的思路,没有绝对的概念去区分这个代码是面向对象还是过程。
对象→类→属性/方法
日常生活中我们把相近的东西分为一类(class),比如鸟类,那一只乌鸦/一只麻雀/一只鸵鸟等等的就是里面的个体,计算机里称为对象,一个类别下有很多对象。鸟类有羽毛,繁衍方式是下蛋,这是鸟类的属性。除了用属性来分类,我们也可以用方法来分类。鸟会飞,会移动,这是鸟的行为,计算机里称为方法(method)。方法在类的内部定义函数。
类(Class)由3部分构成
类的名称:类名
类的属性:特征
类的方法:类能进行的操作行为
1.定义一个类的方法是
class 类名:
类名的第一个字母通常大小写
2.定义类的方法
def 属性名(self,属性值)
记得一定要先self!!!
self参数是为了在方法内部引用对象自身,方法的第一个参数必须位self
3.创建一个对象的方法是
类名()
4.给对象添加属性的方法是
对象.属性名() = 值
5.引用对象属性的两种方法
(1)对象.属性
(2)定义一个方法,这个方法中使用self.属性
栗子
python提供了初始化对象的方法,一系列特殊方法称为魔法方法(magic method),方法名为前后两个下划线,比如__init__()/__add__()/__dict__()
__init__的方法:在每次创建对象时自动调用
self参数还能在一个方法内部调用同一类的其它方法
类别本身还可以细分成子类,我们通过继承表达上述概念
子类可以继承父类的属性,在子类添加父类不存在的属性,从而增强子类的功能。子类还可以进行属性覆盖,在子类替换父类已经存在的属性。
苹果会调用水果的属性而不是食物的属性
但有时子类是父类的拓展,这时就可以用super关键字在子类中调用父类中覆盖的方法
运算符
__add__():将两个对象进行加法运算
__sub__():减法操作
__getitem__():调用[]方法
__setitem__():替换元素
__delitem__():删除元素
__len__():元素总数
__abs__():绝对值
__int__():取整数
__mul__():乘法
__dict__():键为属性名
propetry()特性
内置函数propetry()特性是特殊的属性,propetry()最多可以加载四个参数。前三个参数为函数,分别用于设置获取/修改/删除属性,最后一个参数为特性的文档,可以为一个字符串起说明作用。
__getattr__()方法
__getattr__(self,name) 来查询即生成的属性,只能用来查询不在__dict__中的属性。__getattribute__()可以用来查询任意属性
__setattr__(self,name,value) 修改属性
__delattr__(self,name) 删除属性
__descriptor__
动态类型
1.对象名是对对象的引用,变量名可以随时更改指向,变量类型也可以在程序中改变,python是动态语言
(1)内置函数id(),能够查询到引用指向的是哪个对象,返回对象的编号
(2)用is运算判断两个引用是否指向同一个对象
2.可变对象和不可变对象
(1)不可变对象
整数/浮点数/字符串,不能改变对象本身,赋值最多只能改变对象的指向
(2)可变对象
字典/列表自身对象可以发生改变
3.从动态类型看参数传递
引用计数
getrecount()创建临时引用,所得结果会比期望多1