面对对象
我们在学面对对像的时候其实还有一个面对过程,所以我们要区分两个的区别。
面对对象与面对过程
举个列子:
面对对象:人,写(作业)
面对过程:写,(人,作业)
面对对象就是将人和作业分为两个对象,而面对过程就是将他们步骤的分析出来。
面对对象的特点
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。面向对象的程序设计好比一个玩家设计一场游戏,玩家要解决的问题是把胜利给游戏人物,这时候就需要我方几名游戏人物了:xx,xx,xx,xx,xx,每个人都有各自的特征和技能(这就是对象的概念,特征和技能分别对应对象的属性和方法),然而这并不行,因为还需要几名敌人,当然这些就是对象。然后游戏开始,我方几名人物与敌人互相战斗到最后获得游戏胜利,但是玩家并不会去管我方按照什么过程获得胜利的。
面对对象的优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
面对对象的缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
面对对象的类和实列
在python中定义一个类
class 类名: pass
不同于定义方法,类名后面可以不带括号,如果定义方法的话,必须带括号,比如:
def 方法名(): pass
定义一个类及实例化:
class People: pass laowang = People() # laowang是People的实例化
实例化对象常用函数:
dir([object]) # 会返回object所有有效的属性列表。 vars([object]) # 返回object对象的__dict__属性,其中object对象可以是模块,类,实例,或任何其他有__dict__属性的对象。所以,其与直接访问__dict__属性等价。 help([object]) # 调用内置帮助系统。 type(object) # 回对象object的类型。 hasattr(object, name) # 用来判断name(字符串类型)是否是object对象的属性,若是返回True,否则,返回False callable(object) # 若object对象是可调用的,则返回True,否则返回False。注意,即使返回True也可能调用失败,但返回False调用一定失败。
类中常用的内置函数:
__init__(self,…):初始化对象,在创建新对象时调用 __del__(self):释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd):实例的生成操作 __str__(self):在使用print语句时被调用 __getitem__(self,key):获取序列的索引key对应的值,等价于seq[key] __len__(self):在调用内联函数len()时被调用 __cmp__(stc,dst):比较两个对象src和dst __getattr__(s,name):获取属性的值(s.name) __setattr__(s,name,value):设置属性的值(s.name=value) __delattr__(s,name) 删除name属性(del s.name) __getattribute__():getattribute()功能与getattr()类似 __gt__(self,other):判断self对象是否大于other对象 __lt__(slef,other):判断self对象是否小于other对象 __ge__(slef,other):判断self对象是否大于或者等于other对象 __le__(slef,other):判断self对象是否小于或者等于other对象 __eq__(slef,other):判断self对象是否等于other对象 __call__(self,*args):把实例对象作为函数调用
细说__init__方法:
# __init__方法是在实例化对象之后才会执行,只用来对对象进行初始化操作。 class school: def __init__(self, name, addr, type): self.name = name self.addr = addr self.type = type s1 = school('清华', '北京', '公立大学') # 先调用类产生空对象s1,然后调用school.__init__('清华', '北京', '公立大学') # 注:__init__中默认有return了,再写return就冲突了。
类属性与实例属性:
class People: name = "laowang" age = 12 sex = "nan" laowang = People() laowang.eye_color = "black" laowang.skin_color = "yellow" laowang.sex = "nv" print(People.name) # laowang print(People.age) # 12 print(People.sex) # nan print(laowang.name) # laowang print(laowang.age) # 12 print(laowang.eye_color) # black print(laowang.sex) # nv print(People.eye_color) # 报错 # 由此可见实例可以使用类属性,而类无法使用实例属性 # 类的属性分为:数据属性和函数属性 # 1.类的数据属性是所有对象共有的 # 2.类的函数属性是绑定给对象用的,有兴趣的可以在类中写一个方法,再实例化两个对象,打印一下地址看看是不是不一样。