• 面向对象小结


    1.面向对象的几个经典问题:

    1)什么时候用到面向对象:处理复杂的角色之间关系时;比如开发一个大的系统,功能比较复杂;

      优点:隔离对象之间的调用;提高代码的安全性;代码的清晰度高模块化;可读性,具有可扩展性;增加了代码的复用性;

    2)Python中的一切皆对象:Python中的基础数据类型都是对象;

    3)类型和类的关系:自定的类都是Python的一种新的数据类型,所以类和数据类型是指一个东西;

     说一个对象是什么数据类型就是指它属于哪一个类;

    4)创建一个类:类也是被创建出来的,type创建了类;

    from abc import ABCMeta,abstractmethod  #导入创建抽象类的模块
    class A(metaclass=ABCMeta):        #这是抽象类,(metaclass=ABCMeta)相当于ABCMeta创建了抽象类的空间
        @abstractmethod
        def func(self):
            pass
    print(type(A))                #<class 'abc.ABCMeta'>
    
    class B(metaclass=type):    #如果是一个普通类,就相当于type创建了一个类
        def func(self):
            pass
    print(type(B))                #<class 'type'>

    创建一个类的对象就称为元类(这里ABCMeta,type都是元类)

    有ABCMeta创建的元类不能被实例化;

    **** 创建类和函数的区别,函数体内只有在调用时才会加载,而类在创建时就会执行里面的代码块;

    **** 创建类时会从头读到尾,然后把这个空间赋值给类名:供类名的引用

    5)对象:可以通过指针找到类的空间的内容  对象本身内部也存储了一些只属于对象的属性(但是对象没有自己独特的方法)

    2.组合:

    a:一个类的对象作为另一个对象的属性

    b:组合表示两个对象之间什么有什么的关系

    3.继承:表示两个类之间什么是什么的关系

    a:继承分为单继承和多继承

      单继承:如果子类的对象调用某个方法

          1)子类有:调用子类的

            子类有但想调用父类的:

              a:super:不用自己传self, 格式:super(子类,self).方法名(除了self之外的参数)

              b:父类名:格式:父类名.方法名(self,...)

              注意:在任何类中调用的方法,都要仔细分辨一下self到底是谁的对象

          2)子类没有:就找父类的 

       多继承
       新式类 : 广度优先 - C3算法
       mro方法查看继承顺序
      py3 默认继承object 所以py3都是新式类
       super().func() 遵循mro算法,在类的内部不用传子类名和self
       py2 需要主动继承object
       super(子类名,self).func() 必须传子类名和self
       经典类 : 深度优先
       py2 不继承object,默认都是经典类
       没有mro

    b:作用:提高代码的冗余;提高代码的复用性

    抽象类和接口类

        # 不能被实例化,
    # 规范子类当中必须实现某个方法
    # 有原生(Python解释器自带的语法)的实现抽象类的方法,但是没有原生实现接口类的方法
      # Python解释器不支持的语法,需要你导入的模块不是原生的;


    # 抽象类 : 抽象类中的方法是可以实现的 只能单继承,不能被子类多继承了
    # 接口类 : 可以多继承 但是这个类中的所有方法都不应该实现
    # java
    # java 只支持类的单继承 抽象类 父类的方法可以实现
    # 接口 interface 支持多继承的规范 接口中的所有方法 只能写pass
    3.多态
    a:一种类型的多种形态,
    多个子类去继承父类,那么每一个子类都是这个父类的一种形态
    b:
    # 鸭子类型 规范全凭自觉

    4.封装

    # 广义的封装 : 把方法和属性都封装在一个类里,定义一个规范来描述一类事物.
    # 狭义的封装 : 私有化 只能在类的内部访问
    # 私有的静态变量,私有方法,私有的对象属性,私有的类方法,私有的静态方法
    # 在内存中存储 _类名__名字
    # 为什么在类的内部可以使用双下划线访问 : 在类的内部使用,你就知道你在哪个类中
    # 在子类中可以访问访问父类的私有变量么?不行
    # 私有 : 不能在类的外部使用也不能被继承
    5.property
    装饰器函数,内置函数,帮助你将类中的方法伪装成属性,特性
    # 调用方法的时候不需要主动加括号
    # 让程序的逻辑性更合理
    # @方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
    # @方法名.deleter 装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法
    6.classmethod
    classmethod 类方法的装饰器 内置函数
    # 使用类名调用,默认传类名作为第一个参数
    # 不用对象命名空间中的内容,而用到了类命名空间中的变量(静态属性),或者类方法或静态方法
    7.statimethod
    # staticmethod 静态方法的装饰器 内置函数
    # 如果一个类里面的方法 既不需要用到self中的资源,也不用cls中的资源.
    # 相当于一个普通的函数
    # 但是你由于某种原因,还要把这个方法放在类中,这个时候,就将这个方法变成一个静态方法
    # 某种原因:
    # 你完全想用面向对象编程 ,所有的函数都必须写到类里
    # 某个功能确确实实是这个类的方法,但是确确实实没有用到和这个类有关系的资源
     
  • 相关阅读:
    C++关键字 inline
    MySQL之Join
    leetcode:Isomorphic Strings
    vs中常用的快捷键
    size_t 和 size_type的区别
    使用max函数计算EXCEL个税公式
    什么是数组?
    作业题:输入4个整数,找出其中最大的数。用一个函数来实现. 分别使用结构化方法和函数嵌套的方法。
    c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
    Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9420373.html
Copyright © 2020-2023  润新知