周总结

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

   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))  # <class '__main__.Mytype'>
print(type(Mytype))  # <class 'type'>

    2.7.1 产生类的方式     

      1.class关键字
        class MyClass:
            pass

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

    2.7.2 __new__

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

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

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