课程核心:类与对象的内置函数(BIF)
一、类关系判断BIF
1. issubclass(class, classinfo)
- 功能:判断class是否是classinfo的子类
- 关键特性
- 非严格检查:一个类被视为自身的子类
- classinfo可以是类元组,会逐一检索
- 不满足条件抛TypeError
- 代码示例
- class A; class B(A); class C
- issubclass(B, A) → True
- issubclass(B, B) → True
- issubclass(B, object) → True(所有类默认继承object)
- issubclass(B, C) → False
2. isinstance(object, classinfo)
- 功能:判断实例对象是否属于某个类/某些类
- 关键特性
- 第一个参数必须是实例对象,传类则返回False
- classinfo可以是类元组,逐一检查
- 不满足条件抛TypeError
- 子类实例也属于父类(继承传递性)
- 代码示例
- b1 = B()
- isinstance(b1, B) → True
- isinstance(b1, A) → True
- isinstance(b1, C) → False
二、对象属性操作BIF
共性注意:属性名需传入字符串格式
1. hasattr(object, name)
- 功能:检查对象是否包含指定属性
- 代码示例
- class C: def init(self, x=0): self.x = x
- c1 = C()
- hasattr(c1, "x") → True(必须传字符串"x")
- hasattr(c1, x) → 抛NameError(直接传变量x报错)
2. getattr(object, name[, default])
- 功能:获取对象指定属性的值
- 关键特性
- 属性存在 → 返回属性值
- 属性不存在 → 有default则返回default,无则抛AttributeError
- 代码示例
- getattr(c1, "x") → 0
- getattr(c1, "y", "属性不存在") → "属性不存在"
- getattr(c1, "y") → 抛AttributeError
3. setattr(object, name, value)
- 功能:设置对象指定属性的值,属性不存在则新建
- 代码示例
- setattr(c1, "y", "new_attr")
- getattr(c1, "y") → "new_attr"
4. delattr(object, name)
- 功能:删除对象指定属性,属性不存在抛AttributeError
- 代码示例
- delattr(c1, "y") → 成功删除
- delattr(c1, "y") → 再次删除抛AttributeError
三、特殊BIF:property(fget, fset, fdel, doc)
- 核心作用:通过属性间接操作属性,封装接口,隔离内部修改
- 参数说明
- fget:获取属性的方法
- fset:设置属性的方法
- fdel:删除属性的方法
- doc:文档字符串(可选)
- 代码实操(C类size属性案例)
- 定义基础方法:get_size()、set_size()、del_size()
- 绑定property:x = property(get_size, set_size, del_size)
- 实例调用:c1.x → 调用get_size();c1.x=18 → 调用set_size();del c1.x → 调用del_size()
- 核心优势:内部方法改名不影响用户接口
- 例:get_size改名为get_exercise → 只需修改property参数,用户仍用c1.x调用
- 底层原理:基于魔法方法实现,后续课程讲解
课程总结
- 掌握类关系判断、属性操作的核心BIF
- property实现属性操作的接口封装,提升代码可维护性