• python学习Day22--复习面向对象装饰器+__repr__方法


    【复习】

    1、面向对象

      # 什么时候用面向对象?
        # 处理比较复杂的角色之间的关系
        # 我的代码更清晰了
        # 增强了代码的可拓展性
        # 增加复用性
        # 更加规范
      # python当中一切皆对象
        # 基础数据类型 都是对象
      # 类型和类的关系 类型和类是一个东西
        # type(obj) obj是一个对象,那么它的type就是它的类型
      # 创建一个类
        # class 类名 语法级别的 python解释器读到这句话的时候
        # 类也是被创建出来的,type创建类
        # class A(metaclass=type)
        # type(cls) = type
        # 那么type就是这个类的 元类
      # 创建一个对象
        # 类名() 实例化
        # __new__()创造了一个对象的空间,一些简单的初始化
    2、类
      # 类是什么时候被加载的?以及类名是什么生效的?
      # 一开始就从头到尾开始加载,类里面的东西加载完了类名才生效

    1 class Person:
    2     ROLE='CHINA'
    3     print(ROLE)     # 加载就打印 
    4     print(Person.ROLE)   # 错误,加载中没有Person,只有加载完了类名才生效
    5     def func(self):
    6         pass

      # 静态属性/静态字段/静态变量
      # 动态属性/方法
    3、对象
      # 可以通过指针找到类的空间中的内容
      # 对象本身内部也存储一些只属于对象的属性
    4、组合
      # 一个类的对象作为另一个类对象的属性
    5、 继承
      # 单继承 和 多继承
      # 子类 和 父类
        # 子类有但想调用父类的:
          # super super(子类,self).方法名
          # 父类名.方法名(self,...)
        # 子类没有,父类找
        # 注意:在任何类中调用的方法,都要自己分辨一下这个self到底是谁的对象
      # 经典类 新式类
      # 抽象类和接口类
        # 规范子类当中必须实现某个类
        # 不能被实例化
        # 有原生的实现抽象类方法,但是没有原生实现接口类的方法
    6、多态
      # 一种类型的多种形态
      # 处处是多态
      # 鸭子类型 index方法 (规范全凭自觉)
    7、 封装 私有的
      # 抽象类和接口类
      # 广义的封装:把方法和属性都封装在一个类里,定义一个规范来描述一类事物
      # 狭义的封装:私有化,只能在类的内部访问
      # __私有变量,私有方法,私有的对象属性,私有的类方法,私有的静态方法
      # 在内存中存储:_类名__名字
      # 为什么在类的内部使用可以使用双下划线访问:在类的内部使用,你就知道你在哪个类中
      # 在子类中可以访问父类的私有变量吗? 不能
      # 私有:不能在类的外部使用也不能被继承
    8、property 装饰器函数,内置函数:帮助你将类中的方法伪装成属性,特性
      # 调用方法的时候不需要主动加括号
      # @方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数:被修改的值
      # @方法.deleter 装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法
    9、classmethod 类方法的装饰器 内置函数
      # 使用类名调用,默认传类名作为第一个参数
      # 不用对象命名空间中的内容,而用到了类命名空间中的变量(静态属性),或者类方法和静态方法
    10、 staticmethod 静态方法的装饰器 内置函数
      # 如果一个类里面的的方法 既不需要用到self中的资源,也不需要cls中的资源
      # 相当于一个普通的函数
      # 但是由于某种原因,还要把这个放在类中,这个时候这个方法变成一个静态方法
    11、 反射
      # 从某个指定的命名空间中,用字符串数据类型的变量名来获取变量的值

      # 类名反射: 静态属性 类方法 静态方法

      # 对象反射: 对象属性 方法# 模块:模块中的方法

      # 自己模块中 sys.modules['__main__'] 

    12、 内置方法/魔术方法/双下方法
      # __名字__
      # __str__:str(obj) 要求必须实现__str__,要求这个方法的返回值必须是字符串str类型
      # __call__:对象() 用类写装饰器
      # __len__:len(obj) 要求obj必须实现了__len__,要求这个方法的返回值必须是数字int类型
      # __new__ :在实例化过程中,最先执行的方法,在执行init之前,用来创造一个对象,构造方法
        # 单例类
      # __init__:在实例化过程中,在new执行之后,自动触发的一个初始化方法

    【今日学习】

    1、__repr__方法:是__str__的备胎,如果有__str__方法,那么print('%s') str都先去执行__str__方法,并且使用__str__的返回值,如果没有__str__,那么print('%s') 都会执行repr

      # 在子类中使用__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就执行父类的__str__

      # 但是如果除了object之外的父类都没有__str__方法,就执行子类的__repr__方法,如果子类也没有

      # 还要向上继续找父类的__repr__方法

      # 一直找不到,再执行object类中的__str__方法

     1 # __repr__
     2 # a='123'
     3 # print(repr(a))  # 原形毕露
     4 
     5 class A:
     6     def __init__(self,name):
     7         self.name=name
     8 
     9     def __str__(self):
    10         return '**%s**' % self.name
    11 
    12     # def __repr__(self):
    13     #     return self.name
    14 
    15 a=A('Alex')
    16 print(a)
    17 print(str(a),repr(a))
    18 # print("%s|%r" % (a,a))  # **Alex**|Alex (有__str__的情况下)
    19 # print("%s|%r" % (a,a))  # Alex|Alex     (没有__str__的情况下)
    20 print("%s|%r" % (a,a))    # **Alex** <__main__.A object at 0x000002598BDE1BA8> (没有__repr__的情况)
  • 相关阅读:
    (转)乐观的并发策略——基于CAS的自旋
    mysql避免插入重复数据
    Java_Web使用简单的批处理操作
    Java中jar命令详解
    使用文档注释(javadoc)
    APP和WEB元素定位方法
    RF(二)RF常用库介绍
    RF(一)RF的安装步骤
    javascript匿名函数及闭包深入理解及应用
    javascript简介
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12313674.html
Copyright © 2020-2023  润新知