2019-07-24
面向对象编程思想
什么是面向对象
面向对象是一种编程思想,是前辈们总结的经验.指导程序员如何编写出更好的程序,核心就是对象,程序就是一些列的对象的集合,以对象作为程序的最小单元..程序员只需要使用和调用这些对象来完成交互的任务:
那么说到面向对象就引起了面向过程.面向过程和面向对象的差别就是,一个是亲自干活的人一个是分配任务的让其他的人干活的.面向过程是可控的,面向对象的结果就是不可控的. 然而对象也是需要我们自己来创造的.面向过程的改动性太差,然而面向对象的可变性和可塑性很强,即使改变了其中的一个对象也不会影响其他对象,扩展性比面向过程强的不是一星半点,但是如果只是一个很简单的项目,没有什么改变的项目,那么面向过程要比面向对象简单,很简单的功能适用对象反而复杂了.
面向对象的三大优点:
1.扩展性
2.灵活性
3.重复使用
缺点:
1. 程序的复杂程度相对提高了
2. 无法准确地预知结果,结果的不可控性
使用场景
对扩展性要求比较搞的程序,通常是直接面向用户的比如: 英雄联盟, 刺激战场
类和对象:
类和对象是面向对象中的核心概念
类是什么:
类就是类别,分类,种类,是一系列对像*同的特点和技能的结合体,同意一类的对象,具备的相同特征和行为
那为什么需要类
首先说生活中的类:
现实生活中,通过对对象的分析和总结,得道的类型,用类型表示不同种类的差异:
例: 白菜\萝卜\芹菜 我们把它们分为 蔬菜类
猪肉\鱼肉\羊肉\牛肉 我把它们分为肉食品
那么程序中是否和生活中一样?
在程序中的同样要用不同的标识来区分不同对象的差异
那么什么是对象:
对象就是万物皆对象,在程序中的是:
用变量来表示对象的特征,用函数标识对象的技能
将这些变量和函数结合在一起,形成的就是对象.这也程序中面向对象的精髓所在
对象就是将数据于处理数据的函数绑定在一起
总结:
类和对象的关系:
类就是包含一系列对象
对象属于某个类
在生活中先有对象再有类,在程序中是先有类才有的对象,我们必须告诉计算机这一类的对象有什么相同的特征和行为.
在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,根据这些信息总结出需要的类
创建类和对象
创建类的特定语法:
class 类的名字: # 类的名字单词首字母大写 # 类中的内容 描述性信息 : 属性 和技能 #描述属性用的变量 # 描述性行为用的函数 #类名称 书写规范 首先是见名知意 名称是大驼峰命名法 #驼峰就是单词首字母大写 , 大驼峰是第一个字母大写,小驼峰是第一个字母小写
创捷对象的语法:
class Person: pass # 创建对象 f = Person()
属性的写法:
属性可以写在类中,写在类中的属性就是属于公共的属性
也可以写在对象中,写在对象中的属性是每个对象独特的和其他对象不一样的
属性的访问顺序:
首先访问对象中的属性,如果对象中没有属性,则访问类中的属性
class School: teacher = 'young' f1 = School() f1.name = 'json' f1.age = ' 19' print(f1.teacher) # >>> young print(f1.name) # >>>json print(f1.age) # >>>age
属性的增删改查
增加属性 对象变量名称.属性名称 = 属性值 删除属性 del 对象的变量名称.属性名称 修改 对象.属性 = 新的值 查看属性 访问的是对象的所有属性 print(对象.__dict__) 访问对象的类信息 print(对象.__class__)
初始化方法 __init__
初始化本质就是函数
特点1: 当时实例化对象时,会自动执行__init__方法
特点2: 会自动将对象的第一个参数传入,参数名位self ,self可以是别的名字,但是不建议改变,改变的话影响代码的阅读性
功能就是用户给对象赋予初始值
class Dog: def __init__(self,kind, color, age): self.kind = kind self.color = color self.age = age d1 = Dog('泰迪','棕色',3) d2 = Dog('不拉多','灰色','1') print(d1.age) print(d2.age)
对象的精髓就是讲数据和处理数据的函数整合到一起 ,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数
注意:该函数不能有任何返回值/.... 只能是None 规定如此..
对象绑定方法:
默认情况下类中的方法都是对象绑定方法
其特殊之处在于,
当使用对象调用该函数时会自动传入对象本身,作为第一个参数
当使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数
class Student: def __init__(self, name): self.name = name def say_hi(self): print("hello my name is %s" % self.name) s1 = Student('JSOM') # 使用对象传参数,自动传入对象本身,作为第一个参数 # s1.say_hi() Student.say_hi(s1) # 使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数 # print(s1)
类的绑定方法:
类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
非绑定方法
或叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据
语法:@staticmethod
不常用