面向对象讲解:
‘’‘
面向过程:
核心是过程二字,过程指的是问题的解决步骤,基于过程去设计程序,就好比在设计一条流水线,是一种机械式的思维方式。
优点:复杂的问题流程化,进而简单化
缺点:可扩展性差
应用场景:脚本程序,比如说linux系统管理
面向对象:
核心是对象二字,对象就是特征与技能的结合体。如果把设计程序比喻成创造一个世界,那你就是这个世界的上帝,与面向过程对机械流水的模拟,面向对象更加注重对现实世界的模拟。
优点:可扩展性强
’‘’
类即种别,类别,对象是特征与技能的结合体,那么类就是一系列对象相似的特征与技能的集合体。
在现实世界中,先有一个个具体存在的对象(总结相似之处),得到现实中的类。
在程序中:一定是先定义类,后调用类来产生对象。
第一阶段:现实中的对象总结出现实中的类
obj1:
特征:学校=oldboy,名字=李大泡,年龄=18,性别=女
技能:吃饭,学习,睡觉
obj2:
特征:学校=oldboy,名字=张全丹,年龄=28,性别=男
技能:吃饭,学习,睡觉
obj1:
特征:学校=oldboy,名字=牛柳蛋,年龄=18,性别=女
技能:吃饭,学习,睡觉
第二阶段:程序中的类产生程序中的对象
1 class OldboyStudent: 2 school = 'oldboy' #类的数据属性 3 def learn(self): #类的函数属性 4 print('is learning') 5 6 def eat(self): 7 print('is eating') 8 print('======>')
类体的代码在类定义阶段就会执行,理所应当会产生类的名称空间,用__dict__属性查看
1 print(OldboyStudent.__dict__) 2 print(OldboyStudent.__dict__['school']) 3 print(OldboyStudent.__dict__['learn'])
定义完了,调用的方法为:
print(OldboyStudent.school)
print(OldboyStudent.learn)
调用类里边的函数属性时,如果要加上结果,需要在调用的时候在括号内加值。
# OldboyStudent.learn(123)
修改类的属性#
OldboyStudent.x=1111111111111111111111
# OldboyStudent.school='Oldboy'
# del OldboyStudent.school
# print(OldboyStudent.__dict__)
另外一种方法,但是不推荐这么做:
# OldboyStudent.__dict__['x']=1111111111111111111111
产生程序中的对象:
类名加括号,产生一个该类的实际存在的对象,该调用过程称为实例化。
可以再init中加上类型检查。
eg:
1 class OldboyStudent: 2 school = 'oldboy' #类的数据属性 3 #obj1,'李大炮',18,'女' 4 def __init__(self,name,age,sex): #(类的函数属性)在实例化时,产生对象之后执行 5 # if not isinstance(name,str): 6 # raise TypeError('名字必须是字符串类型') 7 self.name=name 8 self.age=age 9 self.sex=sex 10 # return None #__init__方法必须返回None 11 #obj1.name='李大炮' 12 #obj1.age=18 13 #obj1.sex='女' 14 15 def learn(self): 16 print('is learning') 17 18 def eat(self): 19 print('is eating')
对象可以访问类的数据属性,结论:类的数据属性共享给所有对象使用,id对一样
print(obj1.school,id(obj1.school)) print(obj2.school,id(obj2.school)) print(obj3.school,id(obj3.school)) print(OldboyStudent.school,id(OldboyStudent.school))
类的函数属性是绑定给所有对象使用的,绑定给不同的对象是不同的绑定方法,绑定方法有何特殊之处? 暂且抛开绑定方法,类肯定可以访问自己的函数属性
OldboyStudent.learn(obj1)
OldboyStudent.learn(obj2)
OldboyStudent.learn(obj3)
绑定方法:绑定给谁,就由谁来调用,谁来调用就把“谁”本身当做第一个参数传入
obj1.learn() #OldboyStudent.learn(obj1) obj2.learn() #OldboyStudent.learn(obj1) obj3.learn() #OldboyStudent.learn(obj1)
属性查找顺序:先从对象的__dict__中找,然后到类的__dict__中找,然后父类.... OldboyStudent.school='哈佛'
OldboyStudent.school='哈佛' obj1.school='hahahahahahahhahahahahahah' print(obj1.__dict__) print(obj1.school) print(obj2.school) print(obj3.school)