Day7 面向对象和类的介绍

面向对象讲解:

‘’‘

面向过程:

核心是过程二字,过程指的是问题的解决步骤,基于过程去设计程序,就好比在设计一条流水线,是一种机械式的思维方式。

优点:复杂的问题流程化,进而简单化

缺点:可扩展性差

应用场景:脚本程序,比如说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)

 

posted @ 2017-08-14 17:32  sexiaoshuai  阅读(174)  评论(0编辑  收藏  举报