python学习——反射
生成器、迭代器、装饰器、列表生成式、面向对象、反射、
1.反射*****
getattr
v = getattr(obj,'func')#根据字符串(第二参数)为参数,去对象(第一参数)中寻找与之同名的成员
2.什么后面可以加()?
类()
对象()--执行__call__
函数()
方法()
以上所有都可以被调用。通过callable()来判断
3.1issubclass
检查第一个参数是否是第二个参数的子孙类

class Base: pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Foo,Base))#检查第一个阐述是否是第二个参数的子孙类 print(issubclass(Bar,Base))#检查第一个阐述是否是第二个参数的子孙类
3.2type
获取当前对象是有哪个类创建的
obj = Foo() print(obj,type(obj))# if type(obj) == Foo: print('obj是Foo类型') def func(*args): foo_counter = 0 bar_counter = 0 for item in args: if type(item) == Foo: foo_counter += 1 elif type(item) == Bar: bar_counter += 1 return foo_counter,bar_counter v1,v2 = func(Foo(),Bar(),Foo()) print(v1,v2)
3.3isinstance
检查第一个参数(对象)是否是第二个参数(类)的实例
obj = Foo() print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例 print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例 obj = Base() print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例 print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例
给你一个参数,判断对象是不是由某一个指定类 ————type——type(obj) == Foo
给你一个参数,判断对象是不是由某一个指定类或父类 ————isinstance——isinstance(obj,Foo)
4用科学的方法判断是方法还是函数
def func(): pass print(func) class Foo(object): def detail(self): pass @staticmethod def XXX(): pass obj = Foo() print(obj.detail) print(Foo.XXX) print(obj.XXX)
练习
from types import MethodType,FunctionType def check(arg): ''' 检查arg是方法还是函数 :param arg: :return: ''' if isinstance(arg,MethodType): print('arg是一个方法') elif isinstance(arg,FunctionType): print('arg是一个函数') else: print('不知道') def func(): pass print(func) class Foo(object): def detail(self): pass @staticmethod def XXX(): pass check(func) obj = Foo() check(obj.detail) check(obj.XXX)
练习
class Foo(object): def f1(self): pass def f2(self): pass def f3(self): pass obj = Foo() Foo.f1(obj)#把f1当做函数 obj = Foo() obj.f1()#把f1当做方法,自动传self值
练习1
class Foo(object): def f1(self): pass def f2(self): pass def f3(self): pass list_display = [f1,f2] def __init__(self): pass for item in Foo.list_display: item(123)#此时是个函数
练习2
class Foo(object): def f1(self): pass def f2(self): pass def f3(self): pass list_display = [f1,f2] obj = Foo() Foo.list_display.append(obj.f3) for item in Foo.list_display: print(item)
5.方法和函数*
称谓:
类,方法
外,函数
到底方法函数?
对象.xxx——>xxx就是方法
类.xxx ——>xxx就是函数
xxx ——>xxx就是函数
打印查看:
function
method
代码检查:
from types import MethodType,FunctionType def check(arg): ''' 检查arg是方法还是函数 :param arg: :return: ''' if isinstance(arg,MethodType): print('arg是一个方法') elif isinstance(arg,FunctionType): print('arg是一个函数') else: print('不知道')
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单