反射,魔法方法

魔法方法:

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
原文地址:https://www.cnblogs.com/shaozheng/p/11803367.html