类
对象是特征与技能的结合体
类是一系列对象相同的特征和技能的结合体
如何定义类
首先定义类,后调用类创造对象
定义类的语法
class 类名:
对象相同的特征
对象相同的技能
class 用来定义类的,class后跟类名
注意:类名必须要遵循驼峰命名法
在定义类发生的事情
-
类在定义时,会产生一个空的名称空间
-
会把类内部所有名字,扔进类的名称空间
注意: 类在定义阶段就已经产生好了名称空间
执行python文件时会执行类内部的代码
类名会指向类的名称空间
类“.”特征或技能的方式对类内部的变量值进行修改
“.”会指向类内部的名称空间,从而获取变量值
类的操作有
增、删、改、查
对象
如何产生对象:
语法:
类名() 调用类产生对象
名称空间的产生
- 类的名称空间在类定义阶段就已经产生了
- 对象的名称空间,在调用类时产生
__init__魔法函数在调用类时,自动触发该函数
给对象添加属性的方式
self.name = x
stu1.age = 10
查看名称空间
__dict__
对象与类的查找顺序
- 对象.属性,若对象本身有,则优先查找对象自己的
- 若对象没有,则取类里面找,若类没有,则报错
对象绑定方法的特殊之处
类内部函数主要是给对象用的
- 由类来调用类内部的函数,该函数只是一个普通函数,
普通函数需要接收几个参数就得传入几个参数
-
由对象来调用称之为绑定方法
不同对象调用该绑定方法,则会将不同的对象传入该绑定方法中
继承
继承是一系列类相同特征和技能
继承父类的属性和方法
__bases__查找当前父类
先抽象再继承
问题复杂不好分析时先抽象再继承
在继承的背景下,对象属性的查找顺序
- 对象查找属性会先从对象的名称空间中查找
- 若对象没有,则回去类里面寻找
- 若当前类是子类,并且没有对象找的属性,会去父类查找
注意: 对象查找属性,若子类由,不管父类有没有,以子类的为准
派生
派生指的是子类继承父类的属性,并且派生出新的属性
子类派生出新的属性,若与父类的属性相同,则以子类的为准
子类派生出新的属性,并重用父类
父类.__init__
super().__init__
新式类与经典类
新式类继承object
经典类没有继承object
mro()
查看当前类的继承顺序
钻石继承
在多继承的情况下
经典类 深度优先
新式类 广度优先
组合
继承
类与类的关系,子类与父类的关系
组合
对象与对象的关系,一个对象拥有另外一个对象
@property
在调用是时候不用加上括号来调用可用在if判断语句中
多态与多态性
在使用不同类事物时候,使用的方法名称相同
抽象类,abc @abc
所有子类都遵循父类的方式,使用abc模块,来定死方式
鸭子类型(风格)
像多态一样工作,但是没有继承,关注对象的方法
多态炫技
由一堆相同方法的类,对类的功能抽象化后使用一个定义函数然后统一调用
访问限制
由__开头的变量或者函数变为__类名_变量名
@classmethod
- 对象的绑定方法
- 类的绑定方法
@staticmethod
非绑定方法
可以装饰类内部的方法,使该方法即不绑定给对象,也不绑定给类,变为一个普通函数
uuid
一个加密模块,uuid4随机数字,uuid1基于时间戳
__class__
对象的属性,获取该对象当前的类
isinstance
判读参数1是否属于参数2的一个实例
issubclass
判断参数1是否是参数2的子类
反射
通过字符串对对象或类的属性进行验证或操作
hasattr
判断字符串是否是对象或类的属性
getattr
获取对象或类的属性
setattr
设置对象或类的属性
delattr
删除对象或类的属性
魔法方法(类的内置方法)
__init__ 在调用类的时候触发
__str__ 会在打印对象的时候会触发
__del__对象被销毁前执行该方法,该方法会在最后执行
__getattr__ 会在对象.属性时候,属性没有的情况下才触发
__setattr__ 会在 “对象.属性 = 属性值 “时触发
__call__ 会在对象被调用的时候触发
__new__ 会在__init__ 执行前执行
单例模式
class File:
__instance = None
@classmethod
def singleto(cls,file_name):
if not cls.__instance:
obj = cls(file_name)
cls.__instance = obj
return cls.__instance