【复习】
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__的情况)