python--反射
一 . isinstance, type, issubclass
isinstance 可以判断该对象是否是XXX家族体系中的(只能往上判断)
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(isinstance(Foo(), Foo)) # True print(isinstance(Foo(), Base)) # True print(isinstance(Foo(), Bar)) # False
type(obj) 表示查看obj是由哪个类创建的.
class Boy: pass class Girl: pass # 统计传进来的男生和女生分别有多少 def func(*args): b = 0 g = 0 for obj in args: if type(obj) == Boy: b += 1 elif type(obj) == Girl: g += 1 return b, g ret = func(Boy(), Girl(), Girl(), Girl()) print(ret)
issubclass()这个内置函数可以帮我们判断XXX类是否是YYY类型的子类
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar, Foo)) # True print(issubclass(Foo, Bar)) # False print(issubclass(Bar, Base)) # True
二 . 区分函数和方法
class Foo: def chi(self): print("我是吃") @staticmethod def static_method(): pass @classmethod def class_method(cls): pass f = Foo() print(f.chi) # <bound method Foo.chi of <__main__.Foo object at0x10f688550>> print(Foo.chi) # <function Foo.chi at 0x10e24a488> print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620> print(Foo.class_method) # bound method Foo.class_method of <class'__main__.Foo'>> print(f.static_method) # <function Foo.static_method at 0x10e1c0620> print(f.class_method) #<bound method Foo.class_method of <class'__main__.Foo'>>
仔细观察, 我们能得到以下结论:
1. 类⽅法. 不论任何情况, 都是⽅法.
2. 静态⽅法, 不论任何情况. 都是函数
3. 实例⽅法, 如果是实例访问. 就是⽅法. 如果是类名访问就是函数.
那如何⽤程序来帮我们分辨. 到底是⽅法还是函数呢? ⾸先, 我们要借助于types模块.
# 所有的方法都是MethodType的实例 # 所有的函数都是FunctionType的实例 from types import MethodType, FunctionType def func(): pass print(isinstance(func, FunctionType)) # True print(isinstance(func, MethodType)) # False
三 . 反射
# great.py文件 def play(): print('篮球打的非常好') def piao(): print('pdd是嫖老师') def money(): print('Jack ma 很有钱') def game(): print('pony ma是做游戏的!') s = '哈哈哈'
# 反射操作 import great # great是一个写好的py 文件 while 1: content = input('请输入功能:') if hasattr(great,content): x = getattr(great,content) # x() # 如果是函数可以直接调 print(x, 'luckly!') else: print('非常的不幸')
补充:
关于反射, 其实⼀共有4个函数:
1. hasattr(obj, str) 判断obj中是否包含str成员
2. getattr(obj,str) 从obj中获取str成员
3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥的value可以是值, 也可以是函数或者⽅法
4. delattr(obj, str) 把obj