类(class): 具有相同属性和方法的对象的集合. 对象是类的实例
两种属性: 1,静态变量.
2,方法, 函数
类的操作:
创建类: 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾:
类名角度: 操作静态字段: 1, 查询类中的全部属性 .__dict__
2, 万能的点 . 可以进行 增删改查
对象角度: 操作静态字: 操作类中的方法(除了类方法,静态方法 需要类名调用之外,剩下的方法都要对象调用)
对象实例化过程:
1, 创建了一个对象空间,实例空间,含有一个类对象指针.
2, 并将我的对象空间传给self,自动执行__init__方法.
3, 将这个对象的空间返回给调用者.
组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.
>>>>>------------------------------------------------------------------------------------
一,
父类又称为基类,超类, 子类又称为派生类
继承: 子类中实现父类的方法
继承的意义: 1, 优化代码, 节省代码
2, 提高代码复用性.
3, 提高代码的维护性
4, 让类与类之间发生关系
(ps: 组合: 让对象与对象发生关系)
单继承: 新式类和经典类一样.
多继承:
新式类(继承object类的): 广度优先 类名 . mro() 查询继承顺序
经典类(不含有object的): 深度优先
二,
抽象类, 接口类: python 没有这两个概念
目的是制定一个规范,需要引入abc模块, 为了实现归一化设计
例子有 微信支付宝京东支付功能中,强制含有统一的pay方法
三,
多态是Java定义的名词
python是弱类型语言,没有具体的多态,处处是多态,但是有鸭子类型 :
例如: 不同的内置函数中有相同的方法,这些类就互称为鸭子
四,
封装,私有化,
广义的封装: 实例化一对象,给对象空间封装一些属性.
狭义的封装: 私有制 在静态变量或者方法前面加上 __ (两段下划线)就可以化为私有(本质是在变量或方法名前加上"_类名")
私有成员:静态私有字段, 静态私有方法, 静态私有对象属性
私有静态字段/方法,只有在类的内部可以访问
在类的外部不能调用 访问,在子类中不能访问
五,
属性: @property 声明
将方法伪装成一个属性,在代码的级别上没有本质的提升但是看起来更合理
@属性名. setter 更改返回值
@属性名. deleter 删除属性
六,
@classmethod
类方法: 通过类名调用的方法, 类方法中的一个参数约定成俗称cls, python自动将类名(类空间)传给cls, 可以用点进行各种操作.
使用场景:
1, 无需对象参与.
2, 对类中的静态变量进行修改.
3, 在父类中 通过类方法得到子类的类空间,进行所有操作.
静态方法:
@staticmethod 声明一个 静态方法
1, 形成代码块, 条理更清晰
2, 提高代码复用性, (通过类的继承)
内置函数:
isinstance(对象名,类名) 判断对象所属类型,包括继承关系
issubclass(子类名, 基类名) 判断类与类之间的继承关系
什么是反射?
用字符串数据类型的变量名来访问这个变量的值
反射的方法: getattr[调用方法] hasattr[判断属性/方法是否在类或模块中]
setattr[类名,"属性","重命名"] delattr[删除属性/方法]
反射在面向对象中的应用: 查看属性, 调用方法
命名空间.属性/方法 = getattr(命名空间, "属性/方法")
反射在模块中的应用:
模块名. 方法 = getattr(模块名,"方法")
内置方法: 又叫 双下方法, 魔术方法. 结构 : __方法名__ 类中的双下方法 没有 需要你在外部直接调用的, 而是自动触发的
__call__ 相当于 对象()
__new__ 开辟内存空间的类的构造方法
__len__ = len( obj ) 属性中含有__len__的数据类型才可以计算长度
__init__初始化方法封装对象属性
__str__ 返回对obj的描述
print一个对象相当于调用一个对象的__str__方法
str(obj),相当于执行obj.__str__方法
'%s'%obj,相当于执行obj.__str__方法