python 16 内置方法、反射
day 16 内置方法、反射
复习
-
继承
- 类是用来解决对象之间冗余问题的
- 继承就是用来解决类与类之间冗余问题的
-
先抽象,再继承
对象——>类——>父类
-
经典类与新式类
-
属性查找
- 在单继承背景下,从子类依次往上去寻找
- 多继承中就近原则一条分支一条分支的去找
经典类:深度优先
新式类:广度优先
-
c3算法——>mro列表
以属性查找发起者所在类的mro列表为准
-
派生
在子类派生的新方法中如何重用父类的功能
方式一:父类.函数(),与继承无关
方式二:super().属性,严格依赖继承
super()对象会参照属性查找发起者的mro列表,去当前类的下一个类中找属性
-
绑定方法与非绑定方法
-
绑定方法:谁来调就自动传参
- 绑定给对象:默认绑定给对象
- 绑定给类:给函数加classmethod装饰器
-
-
隐藏属性
__开头的属性会隐藏起来:
- 并不真的隐藏,只是语法意义的变形
- 该隐藏只在类顶一阶段,扫描语法时就会发生变形,类定义之后__开头的属性不会变
- 该隐藏对外不对内
- 可以防止子类覆盖父类的某个属性
隐藏数据属性:开接口,在内内部定义方法查看修改删除隐藏属性
class People: def __init__(self, name): self.__name = name @property def name(self): return self.__name @name.setter def name(self, v): self.__name = v @name.deleter def name(self): del self.__name print('已经删除') obj = People('lem') print(obj.name) obj.name = 'lam' print(obj.name) del obj.name ========> lem lam 已经删除
隐藏功能属性
-
继承表达的关系:is-a
内置方法
__str__
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self): # 打印对象时自动触发执行,将返回值当做打印结果
return self.name # 必须返回str类型的值
obj = People('lem', 18)
print(obj)
==========>
lem
__del__
class People:
def __init__(self, name, age):
self.name = name
self.age = age
self.f = open('a.txt','wb')
def __del__(self): # 删除对象时执行,程序运行结束也会执行
# 回收系统资源
self.f.close()
print('回收系统资源')
obj = People('lem', 18)
del obj
print('=====>end')
isinstance(obj,class)
用来判断obj是否是class的实例,可以用来判断数据类型
issunclass(class,object)
用来判断class是否是object的子类
反射
反射:通过字符串来操作属性
hasattr:属性是否存在
getattr:获取属性
setattr:设置属性
delattr:删除属性
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('=====>',self.name, self.age)
obj = People('lem', 18)
print(hasattr(obj, 'name')) # obj.name
print(getattr(obj, 'name')) # obj.name
f = getattr(obj, 'func')
f()
setattr(obj,'gender','male') # obj.gender='male'
print(obj.gender)
delattr(obj,'name')
print(obj.__dict__)