魔法方法:
isinstance / issubclass :
# isinstance(o,c) -- 判断前者是否为后者所创建的对象
print(isinstance(b,A)) # True
print(isinstance(b,B)) # True
# issubclass --判断前者是否为后者的子类
print(issubclass(B,A)) # True
反射 :
指主要是指程序可以访问、检测和修改它本身状态或行为的一种能力;
反射的优点:可实现一种可插拔机制,
hasattr / setattr / getattr / delattr 函数 :
# hasttr - 查看该对象是否可以使用该属性或者方法
print(hasattr(p, "name"))
# getattr - 获取对象属性
print(getattr(p, "character")) # == p.character
# 可以指定第三个参数,当属性不存在时返回该值,而不会报错
# print(getattr(p,"balabala")) # 报错
# setattr -修改对象属性
setattr(Programmer, "character",
"handsome") # == Programmer.character = "handsome"
# delattr - 删除该属性
delattr(p, "name") # == del p.name
类的魔法方法:
__doc__ : 查看类的描述性息 (类的注释)
__module__ / __class__ :
前者查看当前操作的类所在模块,后者查看当前对象的类是什么;
__init__ : 构造方法
当通过类实例化成对象时,自动触发执行__init__方法。
该方法下定义的属性即为实例属性,即会自动开辟一个内存空间,
用来存放该实例对象的属性和类方法的指针。
__del__ 方法 结束进程
当由该类创建的实例对象,被删除或者说在内存中被释放时,将会自动触发执行
一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。当然我上面重新了析构方法时,则无法真正内存回收,底层会有很多实现的功能被封装。
__call__ 对象后面加括号,触发执行。
构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
触发 : __new__ --> 生成一个空对象
: __init__ --> 触发传入参数 --》obj
: 返回初始化后的对象obj
_dict__ 类或者实例的属性字典 --》 类的内存空间
类或这实例的属性字典,用来存放类或者实例的属性和方法
该属性字典中以键值对的形式,存放类对象的属性和其对应的值 、方法和其对应的方法指针
__str__方法
# 如果一个类中定义了__str__方法,那么在打印对象 时,默认输出该方法的返回值。
__getattr__、__setattr__、__delattr__ :
调用 setattr / getattr / delattr时,便是执行了类中的魔法方法
__setattr__添加/修改属性会触发它的执行
#__delattr__删除属性的时候会触发
#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
attr魔法方法是通过点" . “的方式调用触发,而后者item魔法方法是通过字典”[ ]"的方式调用触发;
https://blog.csdn.net/Mrs_chens/article/details/102811955