python的自省与反射机制
一、自省
自省,就是当解解释型语言被加载到内存中运行时可以知道对象的类型,以及该对象下有哪些方法等。1.1 具备自省能力的方法
type()
获取对象的类型,该函数可以确定对象是字符串、整数、列表、字典等
>>> type(1)
>>> type("hello,world") >>> type([]) >>> type({}) >>> class A(): ...pass ... >>> a = A() >>> type(a)
dir()
【python的自省与反射机制】此函数可以返回某个对象拥有的所有的属性名和方法名
# 返回列表实例的所有方法名 >>> dir([]) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__','__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
getattr()
获取对象的属性
hasattr()
判断对象是否具有某属性
isinstance()
判断一个对象是否是某个特定类型或定制类的实例
>>> isinstance("python", str)# 判断是否为字符串 True >>> isinstance(10, int)# 判断是否为int类型 True >>> isinstance(False, bool)# 判断是否为bool值 True
id()
函数返回对象的唯一标识符,标识符是一个整数。CPython 中 id() 函数用于获取对象的内存地址。
>>> a = "python" >>> id(a) 140225451635560
callable()
使用 callable 可以确定一个对象是否是可调用的,比如函数,类这些对象都是可以调用的对象
>>> callable("hello") False >>> >>> callable(str) True >>>
反射可以通过字符串调用对象属性、方法、导入模块,是一种基于字符串的事件驱动2.1 具备反射能力的内置函数
hasattr()
> 用来检测对象object中是否含有名为name的属性,如果有则返回True,如果没有返回False
class Cls():
attr1 = 'attr1'def __init__(self, attr2):
self.attr2 = attr2def meth1(self, num):
return num**2obj = Cls('attribute2')
print(hasattr(obj, 'attr1'))# >>> True
print(hasattr(obj, 'attr2'))# >>> True
print(hasattr(obj, 'meth1'))# >>> True
无论是变量还是方法,都被视为“属性”,因此hasattr都返回True
# 判断对象的属性是否是方法if hasattr(obj, "attr1"):
if callable(obj.attr1):
# attr1 is a method!
else:
# attr1 is not a method but an attribute
else:
# attr1 is not an attribute
getattr()
> getattr()用于返回一个对象属性,或者方法
getattr(object, name[, default])
- object -- 对象。
- name -- 字符串,对象属性。
- default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
class A:
def __init__(self):
self.name = 'zhangjing'
# self.age='24'def method(self):
print"method print"Instance = A()
print(getattr(Instance , 'name, 'not find'))
#如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'print(getattr(Instance , 'age', 'not find'))
#如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'print(getattr(a, 'method', 'default'))
#如果有方法method,否则打印其地址,否则打印default print(getattr(a, 'method', 'default'))()
#如果有方法method,运行函数并打印None否则打印default
使用场景:
obj = MyObject()
for x in ['foo', 'bar']:# obj.x()# 毫无疑问,这样是报错的。。。。所以我们就可以使用getattrgetattr(obj, x)()
用getattr实现工厂方法:一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出
import statsout
def output(data, format="text"):
output_function = getattr(statsout, "output_%s" %format)
return output_function(data)
这个例子中可以根据传入output函数的format参数的不同 去调用statsout模块不同的方法(用格式化字符 串实现output_%s)
setattr()
setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。
setattr(object, name, value)
- object -- 对象。
- name -- 字符串,对象属性。
- value -- 属性值。
>>class A(object):
...bar = 1
...
>>> a = A()
>>> getattr(a, 'bar')# 获取属性 bar 值
1
>>> setattr(a, 'bar', 5)# 设置属性 bar 值
>>> a.bar
5
delattr()
删除对象中的变量。注意:不能用于删除方法
class Person(object):
def __init__(self,name):
self.name = name
def talk(self):
print("%s正在交谈"%self.name)p = Person("laowang")
delattr(p,"name")# 删除name变量
print(p.name)# 此时将报错
文章图片
世界上没有难学的Python,如果有,那就是你还没关注公众号。喜欢的朋友可以扫码关注
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量