类与类之间的关系
依赖关系. 关联关系. 组合关系. 聚合关系. 继承关系. 实现关系 一. 依赖关系 执行某个动作的时候, 需要借助某个东西, 但这个东西不是绝对的, 此时关系是最轻的, 随时可以更换另外一种东西执行动作, 通过参数的传递把另外一个类的对象传递进来 二. 关联关系. 组合关系. 聚合关系(对象里面埋对象) 这三个在代码写法上是一样的, 但是含义是不一样的 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. 操作对象