反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象,Python作为一门动态编程语言,当然也有反射机制,本文介绍Python反射函数使用方法 。
反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 。在程序运行时可以获取对象类型定义信息,例如,Python中的type(obj)将返回obj对象的类型,这种获取对象的type、attribute或者method的能力称为反射 。通过反射机制,可以用来检查对象里的某个方法,或某个变量是否存在 。也就是可以通过字符串映射对象的方法或者属性 。
Python反射函数【Python反射介绍】Python反射常用的内置函数
- type(obj):返回对象类型
- isinstance(object, classinfo):判断一个对象是否是一个已知的类型,类似 type()
- callable(obj):对象是否可以被调用
- dir([obj]):返回obj属性列表
- getattr(obj, attr):返回对象属性值
- hasattr(obj, attr):判断某个函数或者变量是否存在
- setattr(obj, attr, val):给模块添加属性(函数或者变量)
- delattr(obj, attr):删除模块中某个变量或者函数
class Person():def __init__(self, x, y):self.age = xself.height = ydef __new__(cls, *args, **kwargs):print("begin!!!")return object.__new__(cls)def __call__(self, *args, **kwargs):print("hello!!!")def talk(self):print(f"My age is {self.age} and height is {self.height}")
dir()利用反射的能力,我们可以通过属性字典__dict__来访问对象的属性:p = Person(20, 180)print(p)p()print(p.__dict__)p.__dict__['age']=22print(p.__dict__)p.weight = 60print(p.__dict__)print(dir(p))
执行输出:begin!!!<__main__.Person object at 0x000002484557BCC8>hello!!!{'age': 20, 'height': 180}{'age': 22, 'height': 180}{'age': 22, 'height': 180, 'weight': 60}['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'height', 'talk', 'weight']
- 在实例创建之前调用__new__方法,返回值(实例)将传递给__init__方法的第一个参数 。__new__方法的详细介绍可参考:Python中的__new__和__init__
- 实例化对象时会自动执行 __init__ 方法
- 打印一个对象时,会自动执行__str__ 方法
- 调用实例化对象时,会自动触发__call__ 方法
- 通过dir()方法可以打印出了对象p的属性 。
callable()
if (callable(p)):print("p is callable")else:print("p is not callable")
Out:p is callable
isinstance()和type()print(isinstance(p, Person))print(type(p) == Person)print(isinstance(p.age, int))print(type(p.age) == int)
Out:TrueTrueTrueTrue
hasattr()print(hasattr(p,"talk"))print(hasattr(p.talk,"__call__"))
Out:TrueTrue
getattr()print(getattr(p,"talk"))print(getattr(p.talk, "__call__"))if hasattr(p,'walk'):print(getattr(p,'walk'))else:print("I can't walk")print(getattr(p, "walk", None)) # 如果没有walk属性就返回None
Out:<bound method Person.talk of <__main__.Person object at 0x000001FF52868288>><method-wrApper '__call__' of method object at 0x000001FF52155048>I can't walkNone
setattr()setattr(p,'walk','ON')if hasattr(p,'walk'):print(getattr(p,'walk'))else:print("I can't walk")print(p.__dict__)
Out:ON{'age': 22, 'height': 180, 'weight': 60, 'walk': 'ON'}
delattr()delattr(p,'walk')if hasattr(p,'walk'):print(getattr(p,'walk'))else:print("I can't walk")print(p.__dict__)
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 牛奶加红茶的功效作用,红茶可以加生姜
- 佛山婚俗介绍
- 电源适配器的原理和特点介绍
- 变频电源的工作原理及应用介绍
- 宏润田瑞房地产信息介绍
- 王者荣耀不知火舞穿衣介绍
- 网络安全中端口扫描的一些方案介绍
- Python 语言Django 框架的简化视图
- 帕沙普洱茶介绍,普洱茶熟茶茶性分析
- 九曲红梅红茶知识介绍,九曲红梅茶的功效与作用