面向对象

什么是面向对象?

  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__)
View Code

  对象一旦被创建,就应该进行初始化

  初始化函数名称是固定的的,带有__开头__结尾的函数时一些内置的特殊函数,会在一定的时间点自动触发执行

  __inti__用于初始化对象,会在创建对象时候自动执行,传入调用类时传入的参数 该函数会在调用类时自动触发执行,self参数必须有,表示要进行初始化的对象
        self不需要传值,系统会自动传值

总结:

   一个方法到底是要绑定给方法还是要绑定给类
      当要处理的数据包含在类中时候,不需要绑定给对象,应该绑定给类
      当要处理的数据包含在对象中时候,应该绑定给对象 

   类的绑定方法与对象的绑定方法的相同点和不同点
        相同点:
            1.都会自动传值
            2.都可以被方法和类调用
        不同点:
            1.对象绑定方法在对象调用时传的是对象自己
            2.类绑定方法自动传的是类自己
            3.第一个参数:一个叫cls 一个叫self

    为什么要绑定?
          简化代码,提高效率

 

posted @ 2018-12-13 19:59  yyf1  阅读(264)  评论(0编辑  收藏  举报