zoukankan      html  css  js  c++  java
  • 10.14 面向对象小结

    面向过程编程

    核心是过程,过程指的是做事情的步骤,即先做什么在做什么.
    基于 该编程思想编程,就好比一条流水线,一种机械式的思维方式.

    面对对象编程

    核心是对象,对象指的是特征与技能的结合体.
    基于该编程思想,就好比创造世界,一种上帝式的思维方式.

    类指的是一系列相同特征与技能的对象的结合体.

    如何定义类

    先抽象,抽取相似的特征与技能的对象.

    定义类时发生的事

    1. 会产生一个类的名称空间
    2. 会把类内部的所有名字,放进该名称空间
      注意:定义类时,就会执行类内部的代码,若语法不正确,则会报错.

    对象

    调用类会产生一个对象,调用类的过程称之为类的实例化,对象称之为类的一个实例.

    __init__

    调用类时触发该方法

    调用类时发生的事

    1. 调用类就会产生一个对象的名称空间.
    2. 会触发__init__,接着把对象与括号内所有的参数都传给__init__(),对象当作第一个参数.
    3. __init__内部,可以给对象添加属性

    对象的名字查找

    1. 先找对象自己的
    2. 若对象没有,则去类中查找
    3. 类中没有,则会去object类中查找,没有则报错

    对象的绑定方法的特点

    类用来调用,类内部的方法只是一个普通函数,函数需要几个参数就传几个.
    对象的绑定方法,由对象来调用,会自动把对象当作第一个参数传入该方法.
    注意:不同的对象调用对象的绑定方法,会绑定给不同的对象.

    一切皆对象

    在python中一切皆对象
    python的八大数据类型皆为对象:int,float,str,list,set,dict,tuple,bool

    继承

    继承指的是新建类的方式,新建的类指的是子类或派生类
    子类可以继承一个父类,父类又可以称之为基类或超类

    继承关系的查找

    必须遵循"先抽象,在继承"

    抽象

    抽取相似的部分

    先抽象

    抽取类与类之间相同的特征与技能

    在继承

    确认好子类与父类
    定义父类,父类中写类与类之间相同的特征与技能
    子类继承父类的属性

    继承关系

    类是对象与对象之间的关系,类是一系列对象相同的特征与技能的结合体
    继承是类与类之间的关系,子类与父类是一种从属关系

    派生

    派生指的是子类继承父类的属性,并派生出自己的属性

    子类派生出自己的属性,并重用父类的属性

    1. 直接调用类,类名.属性的方式重用父类的属性.
    2. super(),super().的方式重用父类的属性,super().指向的是父类的名称空间.
      注意:子类派生出于父类相同的属性,以子类的为主.

    在继承背景下,对象属性的查找顺序

    1. 先从对象的名称空间中查找
    2. 去子类的名称空间查找
    3. 去父类的名称空间查找
    4. 去object里查找
    5. 都没有就报错

    新式类与经典类

    继承object的类,都称之为新式类
    在python2中,没有继承object的类,都称之为经典类

    钻石继承(菱形继承)

    新式类:广度优先
    经典类:深度优先

    组合

    组合指的是一个对象的属性,是另一个对象
    组合的作用与继承一样,都是减少重复代码

    继承优缺点

    优:编写的简单
    缺:耦合度高,扩展性低

    组合优缺点

    优:耦合度低,扩展度高
    缺:编写复杂

    封装

    封装是面向对象的核心
    封装指的是把一堆属性,封装到对象中,对象就好比一个袋子,或一个容器

    优点

    方便数据的存取
    可以通过对象.属性的方式获取数据与方法

    访问限制机制

    在类的内部,凡是__开头的属性,都会被隐藏,实际就是变形(_类名__属性)

    优点

    可以对一些重要的数据进行隐藏,不轻易被直接调用,保证数据的安全.

    property

    让看起来像动词的方法,变成以名词的方式调用
    让方法名不需要加括号调用

    多态

    同一种事物的多种形态

    多态的目的

    为了统一代码的编写规范

    多态的实现方式

    继承

    子类继承父类的特征与技能

    抽象类

    1. 导入一个abc模块
    2. 让父类继承一个ABCMeta
    3. 给类内部所有的方法加上abc.abstractmethod装饰器
      子类继承抽象类,强子让子类继承父类的方法,缺一不可.

    鸭子类型

    同一种事物的类,都有相同的功能,这些类都在内部定义相同名称的方法

    classmethod

    是一个装饰器,用来装饰在类内部的方法,可以让该方法变成类的绑定方法.

    对象的绑定方法

    由对象来调用,会把对象当作第一个参数传给该方法

    类的绑定方法

    由类来调用,会把类当作第一个参数传给该方法

    staticmethod

    是一个装饰器,用来装饰在类内部的方法,可以让该方法变成非绑定方法

    非绑定方法的特点

    由谁来调用都是一个普通函数

    面向对象高级

    isinstance

    判断对象是否是类的一个实例

    issubclass

    判断一个类是否是另一个类的子类

    反射

    通过字符串操作对象或类的属性

    hasattr

    判断字符串是否是一个对象或类的属性

    getattr

    通过字符串获取一个对象或类的属性,若没有默认是None

    setattr

    通过字符串设置一个对象或类的属性

    delattr

    通过字符串删除一个对象或类的属性

    魔法方法(类的内置方法)

    __new__

    __init__执行之前触发,必须要返回一个空对象

    __init__

    在调用类时触发,在__new__没有返回一个空对象时不会触发

    __str__

    在打印对象时触发

    __getattr__1.(1与2的区别)***

    会在对象.属性,属性没有时触发.(如果类内部有__getattribute__,就不触发)

    __getattribute__2.(1与2的区别)***

    会在对象.属性,不管属性存不存在都会触发

    __setattr__

    会在对象.属性=属性值时触发

    __del__

    会在对象被销毁前触发

    __call__

    会在调用对象时触发

    __delattr__

    会在对象删除属性时触发

    单例模式

    单例指的是,调用一个类实例化得到多个对象时,对象指向同一个对象名称空间

    IP = '1.1.1.1'
    PORT = 3306
    
    class Mysql:
        __instacne = None
    
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
        @classmethod
        def from_conf(cls):
            if cls.__instacne is None:
                cls.__instacne = cls(IP, PORT)
            return cls.__instacne
    
    obj1 = Mysql.from_conf()
    obj2 = Mysql.from_conf()
    obj3 = Mysql.from_conf()
    
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    

    单例装饰器

    IP = '1.1.1.1'
    PORT = 3306
    
    def singleton(cls):
        cls.__instance = cls(IP, PORT)
    
        def wrapper(*args, **kwargs):
            if len(args) == 0 and len(kwargs) == 0:
                return cls.__instance
            return cls(*args, **kwargs)
        return wrapper
    
    @singleton  # Mysql = singleton(Mysql) # Mysql = wrapper
    class Mysql:
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
    
    obj1 = Mysql()  # wrapper()
    obj2 = Mysql()  # wrapper()
    obj3 = Mysql()  # wrapper()
    
    print(obj1.__dict__)
    print(obj2.__dict__)
    print(obj3.__dict__)
    
  • 相关阅读:
    使用numpy生成二维正态分布
    %matplotlib inline的含义
    The following packages will be SUPERCEDED by a higher-priority channel是什么意思?
    conda命令详解
    软件包,API,SDK的区别
    IP组网实验(使用Cisco Packet Tracer路由器模拟软件)
    MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理
    K'ed by TNT team是什么意思?
    使用Applescript、Automator和AfredWorkflow实现流式工作
    Redux源码分析之createStore
  • 原文地址:https://www.cnblogs.com/793564949liu/p/11674133.html
Copyright © 2011-2022 走看看