什么是面向对象?
1.要了解面向对象必须要知道什么是面向过程.什么是面向过程呢?
面向过程是解决问题的方法,也就是一种编程思想.面向过程主要可以由两个方向理解:面向>>面对;
过程>>是解决问题的步骤和流程.目的是将一个复杂问题拆分为若干小问题,按照步骤一一解决.讲一个复杂问题流程化,为其制定一个固定的实现流程,从而变得简单
面向过程的优缺点:优点:复杂问题简单化
缺点:实现流程固定,一旦中间环节发生改变将导致整体全部都需要修改
维护性差,可扩展性差
使用场景:对扩展性要求较低或者基本没有要求的软件(linux内核,脚本等)
2.面向对象
面向对象是一种编程思想,及代码实现方式方法; oop object oriented prgraming的缩写
将程序看成是一堆对象的集合,实现功能的方式就是对象之间的交互来实现
面向对象的优缺点:优点:不需要考虑繁琐的实现步骤,扩展性高,维护性高,耦合性低
缺点:复杂度比面向过程高,且无法预知执行结果
使用场景:要求扩展性高时,对于不要求扩展性的程序而言,使用面相增加了程序的复杂程度
为什么要使用面向对象?
因为程序与用户打交道,用户需求千变万化,对扩展性要求高,所以需要使用面向对象
类与对象
什么是对象? 指的是具备某些特征与技能的结合体,是实际存在的
什么是类? 类是一个抽象概念,不是实际存在的,是根据一些类具有相同特征和技能的对象抽取获得
类和对象的关系>> 类包含了一些列具有相同特性和技能的对象 对象属于某个类的实例
类名要使用大驼峰的方式来写(首字母大写)
用变量描述特征 obj指一个对象
通过调用类得到对象,也称之为实例化或创建对象
在创建对象时,会申请一个新的内存可能空间,将对象中的内容存进去
存放属性的位置有两个,一个是类中,另外一个是对象中,当每个对象的某个特征都相同时则放在勒种,如果不同则放在对象中
对象中数据查找的顺序:查找顺序>>>对象->>类
当对象中不存在时,会到类中寻找数据
如果对象中存在属性,会有优先使用对象中的数据
__dict__ 可以获取一个对象中包含的所有内容
当创建一个类的时候,产生一个名称空间,存储类中的名称与值的绑定关系
当创建一个对象的时候,产生一个名称空间,存储对象中的名称与值的绑定关系
类还有作为对象的模板的作用,所有属于同一个类的对象都具备类中的公共内容
绑定方法
绑定:把两个东西捆绑在一起 方法:>>函数 在类中函数即方法
绑定方法:就是将数据与处理数据的函数绑定在一起
为什么要把函数和对象绑定在一起?
调用函数时,变成调用函数的方法 对象的本质就是一种存放数据的容器
为什么要把数据和函数绑定在一起? 函数适用于处理数据的代码
如何绑定? >>>绑定方法有两种,一种是绑定给对象,另外一种是绑定给类
绑定给类的方法:使用一个装饰器叫@classmethod,必须有一个参数,表示当前类,参数名也可以自己定义但是不建议
1 #绑定对象 2 class Student: 3 school = "BeiJing" 4 5 def __init__(self, name, age, sex): 6 self.name = name 7 self.age = age 8 self.sex = sex 9 10 def learning(self): 11 print("正在学习..") 12 13 def sayHI(self): 14 print("hello my name is %s my age:%s my sex:%s" % (self.name, self.age, self.sex)) 15 16 #通过对象获取 17 stu1 = Student("一个学生","man",18) 18 stu1.sayHI() 19 #通过类获取 20 Student.sayHI(stu1) 21 '''---------------------''' 22 #绑定类 23 class Students: 24 school = 'fudan' 25 #初始化函数 26 def __init__(self,name,age,sex): 27 self.name = name 28 self.age =age 29 self.sex = sex 30 31 def sayHI(self): 32 print(self.name,'hello') 33 34 @classmethod 35 def print_school_name(cls): 36 print(cls.school) 37 38 Student.print_school_name() 39
调用方法:
绑定给对象:
对象绑定方法 可以使用对象调用,也可以使用类名调用
在对象调用时会自动传入对象自己
类调用是不会自动传参,需要手动传参
绑定给类:
类绑定方法 用类调用
对象也可以调用,并且都会自动传入这个类
非绑定方法:
1 class Teacher(): 2 def __inti__(self,name,sex): 3 self.name = name 4 self.sex = sex 5 6 @staticmethod 7 def testfunc(num): 8 print('testfunc run !') 9 print(num) 10 11 Teacher.testfunc(1)
在类中既不绑定给方法,也不绑定给对象;即既不需要访问类的数据,也不需要访问对象的数据,就可以作为一个非绑定方法
特点:没有自动传参数的效果 ; 类和对象都能调用 ; 就是一个普通函数
初始化函数:
1 class Person: 2 def __init__(self,name,age): 3 print("执行了 __init__") 4 print(self) 5 self.name = name 6 self.age =age 7 8 p1 = Person("张三丰",80) 9 10 print(p1.__dict__) 11 12 p2 = Person("李狗蛋",20) 13 print(p2.__dict__)
对象一旦被创建,就应该进行初始化
初始化函数名称是固定的的,带有__开头__结尾的函数时一些内置的特殊函数,会在一定的时间点自动触发执行
__inti__用于初始化对象,会在创建对象时候自动执行,传入调用类时传入的参数 该函数会在调用类时自动触发执行,self参数必须有,表示要进行初始化的对象
self不需要传值,系统会自动传值
总结:
一个方法到底是要绑定给方法还是要绑定给类
当要处理的数据包含在类中时候,不需要绑定给对象,应该绑定给类
当要处理的数据包含在对象中时候,应该绑定给对象
类的绑定方法与对象的绑定方法的相同点和不同点
相同点:
1.都会自动传值
2.都可以被方法和类调用
不同点:
1.对象绑定方法在对象调用时传的是对象自己
2.类绑定方法自动传的是类自己
3.第一个参数:一个叫cls 一个叫self
为什么要绑定?
简化代码,提高效率