zoukankan      html  css  js  c++  java
  • 面向对象基础

    一、面向对象编程思想

    1.什么是面向对象?

    面向对象是一张编程思想,是前辈们总结出的经验,可以指导程序员编写出更好的编程

    核心是对象,程序就是一系列对象的集合,程序员负责调度控制这些对象来交互着完成任务

    案例1:把大象装进冰箱

    面向过程:

    1.打开冰箱门

    2.把大象放进冰箱

    3.关上冰箱

    面向对象:

    找个具备大象的技能的对象

    在面向对象中程序员的角度发生该改变,从具体的操作者变成了指挥者

    强调:对象并不是凭空产生的,需要我们自己先设计。

    面向对象优秀案例:

    话说三国时期曹军于官渡大败袁绍,酒席之间,曹操诗兴大发,吟道:喝酒唱歌,人生真爽! 众将直呼:"丞相好诗",于是命印刷工匠刻板印刷以流传天下;

    待工匠刻板完成,交与曹操一看,曹操感觉不妥,说道:"喝酒唱歌,此话太俗,应改为'对酒当歌'较好",于是名工匠重新刻板,当时还没有出现活字印刷术,如果样板要改,只能重新刻板,工匠眼看连夜刻版之工,彻底白费,心中叫苦不迭。可也只得照办。

    版样再次出来请曹操过目,曹操细细一品,觉得还是不好,说”人生真爽太过直接,应该改问语才够意境,因此应改为‘对酒当歌,人生几何?’“,于是....

    在活字印刷术还没出现之前,如果版样有改动,只能重新雕刻。而且在印刷完成后,这个样板就失去了它的价值,如果需要其他样板只能重新雕刻。而活字印刷术的出现就大大改善了印刷技术。如上例”喝酒唱歌,人生真爽“,如果用活字印刷,只需要改四个字就可,其余工作都未白做。岂不快哉!!

    活字印刷也反应了OOP。当要改动时,只需要修改部分,此为 可维护;当这些字用完后,并非就完全没有价值了,它完全可以在后来的印刷中重复使用,此乃 可复用;此诗若要加字,只需另刻字加入即可,这就是 可扩展;字的排列可以横排,也可以竖排,此是 灵活性好。

    由上述的故事中,我们得出了:

    面向对象的三大优点:

    1.扩展性

    2.灵活性

    3.重用性

    但凡事都有两面性,面向对象也有它的缺点:

    1.程序的复杂度提高了

    2.无法准确欲知结果

    面向对象的使用场景:

    对扩展性要求较高的程序,通常是直接面向用户的,例如:QQ,微信

    但也并不是完全否定了面向过程的思想,面向过程的优点是逻辑清晰,复杂的问题能够简单化,流程化,缺点就是:扩展性差,可维护性也差。可以用在对扩展性要求较低的程序例如:系统内核,git,计算器

    二、类和对象

    这是OOP中的最核心的两个概念

    类:即类型,类别,是一种抽象概念。是一系列具备相同特征和相同行为的对象的集合。

    对象:就是具体存在的某个事物,具备自己的特征和行为,对象就是特征和技能的集合。

    三、类和对象的关系

    类包含一系列对象,对象属于某个类,在生活中是先有对象再有类,但是在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为。

    总结:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据这些信息总结出需要的类型

    四、创建类和对象

    #定义类的语法
    class 类的名称:
            #类中的内容 描述属性和技能
            #描述属性用变量
            #描述行为用函数
    #类名称 书写规范 首先做到见名知意 名称是大驼峰命名法
    #驼峰体就是单词的首字母大写,大驼峰体就是第一个字母大写,小驼峰体是第一个字母小写
    #创建对象的语法
    class Person:
        pass
    
    #创建对象
    p = Person()

    属性可以写在类中,类中的属性是所有对象公共的,也可以写在对象中,对象的属性是每个对象独特的特征,如果类中和对象中存在同样的属性,首先访问对象,如果没有再访问类。

    练习:描述一个老师类,需要包含一个公共属性和一个独特的属性

    1 class Teacher:
    2     task = '教书育人'
    3 
    4 t1 = Teacher()
    5 t1.name = 'jerry'
    6 t1.age = '30'
    7 print(t1.__dict__)#{'name': 'jerry', 'age': '30'}

    属性的增删改查:

    增加属性:对象变量名称.属性名称 = 属性值

    删除对象: del对象的变量名.属性名称

    修改:对象.属性 = 新的值

    查看属性:访问的是对象的所有属性 print(对象.__dict__)

         访问对象的类信息 print(对象.__class__)

    五、初始化对象的属性

    init方法叫做初始化方法,本质上就是一个函数

    特点1:当实例化对象时,会自动执行init方法

    特点2:会自动将对象作为第一个参数传入,参数名称位self,self可以是别的名字,但是不建议。

    功能:用户给对象赋初始值

    练习:创建一个类具备几个属性,通过初始化方法来给他设置属性

    1 class Dog:
    2     def __init__(self,kind,color,age):
    3         self.kind = kind
    4         self.color = color
    5         self.age = age
    6 d1 = Dog('哈士奇','黑白','5')
    7 d2 = Dog('中华田园犬','黄色','2')
    8 print(d1.__dict__,d2.__dict__)
    9 #{'kind': '哈士奇', 'color': '黑白', 'age': '5'} {'kind': '中华田园犬', 'color': '黄色', 'age': '2'}
    #注意:该函数不能有任何返回值,只能是None

    对象的精髓就是将数据和处理数据的函数整合到一起,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数。

    六、对象的绑定方法

    默认情况下类中的方法都是对象绑定方法。其特殊之处在于,当使用对象调用该函数时会自动传入对象本身,作为第一个参数,当使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数

    练习:写一个学生类,具备一个打招呼的技能,要能输出自己的名字信息

    class Student:
        school = '文正学院'
        def __init__(self,name):
            self.name = name
        def say_hi(self):
            print('hello i am a student,my name is %s,i am from %s'%(self.name,self.school))
    
    stu1 = Student('zzj')
    
    stu1.say_hi()

    七、类绑定方法

    类绑定方法用@classmethod来装饰

    特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数

    什么时候绑定给对象:当函数逻辑需要访问对象中的数据时

    什么时候绑定给类:当函数逻辑需要访问类中的数据时

     1 class Student:
     2     school = 'Tsinghua'
     3     def __init__(self,name):
     4         self.name = name
     5 
     6     @classmethod
     7     def show_school(cls):
     8         print(cls)
     9 
    10 Student.show_school()
    11 
    12 stu = Student('zzj')
    13 stu.show_school()

    八、非绑定方法

    或叫做静态方法,就是就不需要访问类的数据,也不需要访问对象的数据

    语法:@staticmethod

    不经常使用

    练习:为学生类添加一个save方法 一个get方法save是将对象存储到文件中get是从文件中获取对象

     1 import pickle
     2 
     3 class Student:
     4     def __init__(self,name):
     5         self.name = name
     6 
     7     def say_hi(self):
     8         print('name:',self.name)
     9 
    10     def save(self):
    11         with open (self.name,'wb') as f:
    12             pickle.dump(self,f)
    13             f.flush()
    14 
    15     @staticmethod
    16     def get(name):
    17         with open(name,'rb') as f:
    18             obj = pickle.load(f)
    19             return obj
    20 
    21 stu = Student('rose')
    22 stu.save()
    23 
    24 msg = stu.get('rose')
    25 print(msg)
  • 相关阅读:
    RPC
    Memcache
    python supervisor使用
    代码规范
    值传递,引用传递
    日志文件目录
    input标签的事件汇总
    箭头函数
    JS数组reduce()方法
    关于Python变量的学习总结
  • 原文地址:https://www.cnblogs.com/spencerzhu/p/11241521.html
Copyright © 2011-2022 走看看