• 周总结


    • 目录
      • 编程思想
        • 面向过程
        • 面向对象
          • 定义
          • 对象与类
          • 三大特征
          • 派生
          • 反射
          • 魔法方法(双下方法)
          • 元类
    • 编程思想

       1.面向过程:按照顺序及流程编写代码最终达到想要的结果(面向对象之前的编程都属于面向过程编程)

       2.面向对象:

        2.1 定义:将特定的数据与特定的方法绑定(只考虑最初的创建不考虑结构:如游戏人物构造)

       注:面向过程与面向对象没有优劣之分按照不同的情况使用,多数情况下是相互存在使用

        2.2.对象与类

         2.2.1 对象:将特定数据与特定方法绑定的存储容器(防止数据被别的方法引用,也防止方法引用别的数据,互相绑定完成想要的目标)

         2.2.2 类:多个对象共同的数据与方法的存储容器(方法也是对象特有方法(创建独特对象的方法)通过类去创建出含有共同数据也含有自己独特数据的对象)

          2.2.2.1 类的语法结构

           关键字:class

           类名:与变量名命名一致(首字母大写-大驼峰形式)

           类体编码:数据与方法

          2.2.2.2 对象的创建-类名加括号(类的实例化)

        2.3 面向对象的三大特征

          2.3.1 绑定:将一些数据采用(__name)双下划线的格式对数据进行隐藏,然后通过统一的方法进行访问(其实python没有强制要求只不过是换了名字,但还是要遵循规则,不然就没有存在的意义)

            property伪装:将需要输出的数据按照实际性质区分进行输出 

          2.3.2 多态:一种形态的多种表现形式,继承父类然后使用与父类相同的方法但数据输出属于对象自己特性

          2.3.3 继承:引用别的类所拥有的数据或方法,使重复代码减少。

             被继承的类:父类、基类、超类

             接收继承的类:子类、派生类

          2.3.4 对象名字查找顺序:自身>>>创建自身的类>>>继承的父类>>>多继承的父类分支>>>继承分支最后分类共同继承的类

         2.3.5 经典类与新生类

           经典类:没有自动继承object类的类(python2环境)

           新生类 :自动继承object类的类(python3环境)  

       2.4 派生方法:在子类中定义父类的功能并增加功能,重写父类方法后做修改后要继续沿用父类方法的后续步骤,用supor().父类方法名()

         派生案例:将时间字典序列化成json格式,由于序列化数据类型的要求,时间类型不属于json格式序列化的数据类型

              json函数中参数cls = JSONEncoder(是个类)

              类中影响数据类型的方法是def default(self, o)

              用派生方法在原有方法上做数据类型转换

              最后继续执行父类JSONEncoder的后续步骤完成时间类型序列化

       2.5 反射:通过字符串来操作对象的数据或方法,存在关键字字符串、对象肯定是需要进行反射操作

          2.5.1 反射方法

            2.5.1 hasattr():判断对象是否含有某个字符串对应的属性

            2.5.2 getattr():获取对象字符串对应的属性

            2.5.3 setattr():根据字符串给对象设置属性

            2.5.4 delattr():根据字符串给对象删除属性

          2.5.2 反射案例

    复制代码
    from conf import settings
    
    # 判断settings文件中大写的数据并获取该数据
    # 创建大写数据存储列表
    upper_dict = {}
    info_dict = dir(settings)
    for i in info_dict:
        if i.isupper():
            v = getattr(settings, i)
            upper_dict[i] = v
    
    print(upper_dict)   # {'BASE_PATH': 'D:\\code\\python\\day34', 'DB_PATH': 'D:\\code\\python\\day34\\db'}
    复制代码

       2.6 魔法方法:双下方法、需要一些触动方法

         2.6.1 __init__:实例化时触发(类创建对象时)

    复制代码
    class School:
        school = '南芜大学'
    
        def __init__(self, major):
            self.major = major
            print('__init__')     # __init__
    
    
    stu = School('摄影专业')
    print(stu.major)             # 摄影专业
    复制代码

       2.6.2 __str__:打印时触发、需要返回值,不写return或写return后面不写东西否返回None--print(stu.__str__())

    复制代码
    class School:
        school = '南芜大学'
    
        def __str__(self):
            print('__str__')     # __str__
            # return '111'       # None
    
    
    stu = School()
    print(stu.__str__())  # 摄影专业
    复制代码

       2.6.3 __call__:对象加括号打印时触发--print(stu()) 

    复制代码
    class School:
        school = '南芜大学'
    
        def __call__(self, *args, **kwargs):
            print('__call__')     # __call__
            print(args)           # ()
            print(kwargs)         # {}
            return '摄影专业'
    
    
    stu = School()
    print(stu())     # 摄影专业
    复制代码

       2.6.4 __getattr__:当对象获取一个存在的属性名 自动触发 该方法返回什么 

    复制代码
    class School:
    school = '南芜大学'

    def __init__(self, name, age):
    self.name = name
    self.age = age

    def __getattr__(self, item):
    print('__getattr__') # __getattr__
    return '摄影专业'


    stu = School('jason', 18)
    print(stu.__getattr__('name')) # 摄影专业
    print(stu.__dict__) # {'name': 'jason', 'age': 18}
    复制代码

      2.6.5 __getattrbute__:当对象获取一个存在或不存在的属性名 自动触发 该方法返回什么 

    复制代码
    class School(object):
        school = '南芜大学'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __getattribute__(self, item):
            print('__getattribute__')      # __getattribute__
            print(item)               # age
            return super().__getattribute__(item)      # 18
    
    
    stu = School('jason', 18)
    print(stu.age)          # 18
    复制代码

       2.6.6 __setattr__:对象操作属性值的时候自动触发>>>:  对象.属性名=属性值

    复制代码
    class School:
    school = '南芜大学'

    def __setattr__(self, key, value):
    print('__setattr__') # __getattr__
    print(key) # major
    print(value) # 摄影专业
    return '摄影专业'


    stu = School()
    print(stu.__setattr__('major', '摄影专业')) # 摄影专业
    复制代码

       2.6.7 __delattr__:对象在被删除(主动 被动)的时候自动触发

    复制代码
    class School:
        school = '南芜大学'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __delattr__(self, item):
            print('__setattr__')      # __setattr__
            print(item)               # major
            return '摄影专业'
    
    
    stu = School('jason', 18)
    print(stu.__delattr__('name'))     # 摄影专业
    复制代码

       2.7 元类:产生类的类(type)

    复制代码
    class Mytype():
        def __call__(self, *args, **kwargs):
            print('产生类的类')
    
    
    obj = Mytype()
    print(type(obj))  # 
    print(type(Mytype))  # 
    复制代码

        2.7.1 产生类的方式     

          1.class关键字
            class MyClass:
                pass

          2.利用元类type
            type(类名,类的父类,类的名称空间)

        2.7.2 __new__

         类产生对象的步骤
          1.产生一个空对象
          2.自动触发__init__方法实例化对象
          3.返回实例化好的对象

           __new__方法专门用于产生空对象 骨架

           __init__方法专门用于给对象添加属性

     

      

      

           

           

     

  • 相关阅读:
    贯头山酒——中华酒文化的源头之一
    实操技巧:私域+公域=全渠道获客
    电压源与电流源简介
    C# DateTime转String
    vdsm:添加接口调试demo
    Dockerfile 镜像创建
    请别再使用 parseInt() 了
    [极致用户体验] 我做的《联机五子棋》是如何追求极致用户体验的?(上)
    第三篇 RBAC权限管理 数据库设计详解
    卷积公式和分布函数去解决Z=X+Y,Z=XY,Z=Y/X等Z的概率密度函数以及如何确定他们的范围
  • 原文地址:https://www.cnblogs.com/040714zq/p/16538358.html