Python基础18_类与类之间的关系
类与类之间的关系
依赖关系. 关联关系. 组合关系. 聚合关系. 继承关系. 实现关系
一. 依赖关系
执行某个动作的时候, 需要借助某个东西, 但这个东西不是绝对的, 此时关系是最轻的, 随时可以更换另外一种东西执行动作, 通过参数的传递把另外一个类的对象传递进来
二. 关联关系. 组合关系. 聚合关系(对象里面埋对象)
这三个在代码写法上是一样的, 但是含义是不一样的
1. 关联关系
两种事物必须是互相关联的, 但在某些特殊情况下是可以更改和更换的
一对一关系: 在初始化的时候给一个对象的属性设置成另一个类的对象, 把属性和对象联系起来
一对多关系:
2. 聚合关系
属于关联关系的一个特例, 侧重点是xxx和xxx聚合成xxx, 各有各的生命周期,
3. 组合关系
属于关联关系中的一个特例, 组合关系比聚合关系要紧密
三. 继承关系
子类在不影响父类的程序运行的基础上对父类进行的扩充和扩展, 这里, 把父类成为超类或者基类, 子类被称为派生类
类名和对象默认是可以作为字典的key的, 可以hash, 即字典的key可以是对象或者类
self: 谁调用的就是谁, 类型是根据调用方对象来变换的, 访问顺序: 永远是先找自己的, 自己的找不到再找父类的
四. 类中的特殊成员
带双下划线的, 这些方法在特殊的场景会自动的执行
__init__(self):
类名() 会自动执行, 初始化操作,
__call__(self, *args, **kwargs):
对象() 会自动执行, 为了对象可以被调用
__getitem__(self, item):
对象[key] 会自动执行,
__setitem__(self, key, value):
对象[key] = value 会自动执行
__delitem__(self, key):
del 对象[key] 会自动执行
__add__(self, other):
对象 + 对象 自动执行
__enter__(self):
__exit__(self, exc_type, exc_val, exc_tb):
with 对象 as 变量 会自动执行, 先执行__enter__, 再执行__exit__
__str__(self):
打印对象的时候会自动执行 返回该对象的字符串变现形式
__repr__(self):
返回该对象的官方字符串表现形式
__hash__(self):
__hash__ == None 对象就不可哈希了
__new__(cls, *args, **kwargs):
真正的构造方法, 创建对象时可以开辟空间, 所有对象的创建都是通过__new__实现
object基类默认有_new__
__getattr__
如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, 如果没有定义这个函数,那么抛出AttributeError异常
五. 创建对象的步骤
1. 加载类
(给类创建一个名称空间, 存放类变量, 此时不创建类对象, 也能使用类变量)
2. 创建对象: 开辟内存(__new__), 初始化(__init__)
(先找类, 根据类名来开辟内存执行类中的__new__和__init__, 返回对象)
3. 操作对象