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__的情况)

猜你喜欢

转载自www.cnblogs.com/fengxb1213/p/12313674.html