面向过程编程:
核心是过程两个字,指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计的程序就好比在设计一条流水线,是一种机械的思维方式。
优点:复杂问题流程化,
缺点:程序的可扩展性差
面向对象编程:
核心是对象两个字,对象指的是有特征(属性)及行为(方法)的具体的个体,面向对象本质上是将数据和处理数据的程序封装在类的本体中。
优点:程序的拓展性强,解决问题的思路可以不止一条
缺点:编程的复杂度高于面向过程
类与对象:
扫描二维码关注公众号,回复:
5947929 查看本文章
类:
类即类别,种类,是面向对象设计最重要的概念,类可以理解为一系列对象特征与技能的结合体。
在程序中,我们是先定义类,再通过类的实例化产生对象。
定义语法:
class 类名:
类的使用:
-
-
- 引用类的属性
- 调用类得到实例化对象
- __init__方法
-
注意:
-
- 类中可以有任意python代码,这些代码在类的定义阶段便会执行一次,会产生新的名称空间,用来存放类的变量名与函数名,可以通过.__dict__查看
- 类中定义的名字,都是类的属性,点语法 可以访问属性的方法
- 对于经典类来说,我们可以通操作字典来操作类的名称空间的名字,但是新式类有限制(python3中定义的类都是新式类,都会继承object)
class Student: school = '清华' def __init__(self, name, age, sex): name = name age = age sex = sex def choice(self): print('choose course') print(Student.__dict__) # st1 = Student('zhangsan','18','male') s1 = Student() s1.name = 'qzk' # 点语法访问name # p1,p2虽然能被访问school,但是school属于Peple 类,只有一份,且被调用, print(s1.school) # ''' # 小结: # 类的对象,拥有名称空间 # 类拥有自己的名称空间 # 所以可以通过.语法来添加属于自己的功能或特征 # 类一旦被加载,就会进入类的内部执行类中的所有代码(随着所属文件的加载就加载,不依赖于类的调用) # 属性的加载或访问顺序: # 优先加载自己(对象)的属性 # 如果没有在考虑类 每个实例化的对象及类都有自己的名称空间 类与对象都可以拓展功能 提前在类中书写的属性与方法在对象一产生就可以使用这些属性和方法 类会随着所属文件的加载而加载(执行内部所有代码),形成类的名称空间 对象查找属性的顺序: 先找自己,如果没有,找类的(只有访问权没有修改权) '''
属性查找顺序与绑定方法:
查找顺序:
以 obj.name 为例,会先从obj(对象本身)自己的名称空间找name,找不到这去类中找,类也找不到就去找父类.....最后都找不到就会抛异常。
类的两种属性:
-
- 数据属性:类的数据属性是所有对象共享的(对象在使用类的数据属性的时候,本质上类的数据属性还是在类的名称空间中,对象的名称空间中是查找不到该数据属性的)
- 函数属性:类的函数属性是绑定给对象用的,称为绑定到对象的方法。
绑定方法:
-
- 类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但是必须遵循函数的传参规则,有几个参数就需要传几个参数。
- 类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,主要是给实例化的对象使用的,而且是绑定到对象,虽然所有实例化的对象指向类的函数属性都是相同的功能,但是绑定到不同的对象就是不同的绑定方法。
- 绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写 self21