一、自省
自省,就是当解解释型语言被加载到内存中运行时能够晓得对象的类型,以及该对象下有哪些办法等。
1.1 具备自省能力的办法
-
type()
获取对象的类型,该函数能够确定对象是字符串、整数、列表、字典等
>>> type(1) <type 'int'> >>> type("hello,world") <type 'str'> >>> type([]) <type 'list'> >>> type({}) <type 'dict'> >>> class A(): ... pass ... >>> a = A() >>> type(a) <type 'instance'>
-
dir()
此函数能够返回某个对象领有的所有的属性名和办法名
# 返回列表实例的所有办法名 >>> 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 = attr2 def meth1(self, num): return num**2 obj = 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() # 毫无疑问,这样是报错的。。。。所以咱们就能够应用getattr getattr(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,如果有,那就是你还没关注公众号。喜爱的敌人能够扫码关注