反射-isinstance()-issubclass()-dir-callable
一.反射
反射一共就四个函数:
getattr(object,name)
从xxx对象中获取到xxx属性值
hasattr(object,name)
判断xxx对象中是否有xxx属性值
delattr(object,name)
从xxx对象中删除xxx属性
setattr(object,name,value)
设置xxx对象中的xxx属性为xxxx值
attr的全称是 attribute 属性的意思
# 对于模块而言可以使用getattr, hasattr, 同样对于我们的对象也可以执行类似的操作
class Person:
def __init__(self, name, laopo):
self.name = name
self.laopo = laopo
p = Person("宝宝", "林志玲")
print(hasattr(p, "laopo")) #
print(getattr(p, "laopo")) # p.laopo
setattr(p, "laopo", "胡一菲") # p.laopo = 胡一菲
setattr(p, "money", 100000000000) # p.money = 100000000
print(p.laopo)
print(p.money)
delattr(p, "laopo") # 把对象中的xxx属性移除. != p.laopo = None
print(p.laopo)
二.isinstance()函数.
isinstance: 判断你给对象是否是x类里的. (向上判断,不考虑继承关系)
三.type()函数.
返回xxx对象的数据类型(精确到上一层)
四.issubclass()函数.
只能向下判断.(考虑继承关系)
五.其他零星补充:
如何判断是方法还是函数:
from types import FunctionType, MethodType # 方法和函数 from collections import Iterable, Iterator # 迭代器 class Person: def chi(self): # 实例方法 print("我要吃鱼") @classmethod def he(cls): print("我是类方法") @staticmethod def pi(): print("泥溪镇地皮")
p = Person() print(isinstance(Person.chi, FunctionType)) # True print(isinstance(p.chi, MethodType)) # True print(isinstance(p.he, MethodType)) # True print(isinstance(Person.he, MethodType)) # True print(isinstance(p.pi, FunctionType)) # True print(isinstance(Person.pi, FunctionType)) # True
callable(obj)检测该参数是否可调用.
对象是否可被调用,看类中是否定义了__all__方法,有就可以,没有就不可以
dir(obj)查看x对象中的所有内容(方法,函数,内置函数)
函数和方法如何区分:(FunctionType,MethodType)
from types import FunctionType, MethodType class Car(object): def __init__(self): pass def run(self): print("my car can run!") @staticmethod def fly(self): print("my car can fly!") @classmethod def jumk(cls): print("my car can jumk!") c = Car() print(isinstance(c.run,MethodType)) # True print(isinstance(Car.run,FunctionType)) #True