issubclass,
isinstance,
type
1 #issubclass 判断第一个参数是否为第二个参数的子类 ture / false 2 class Base(object): 3 pass 4 class Foo(Base): 5 pass 6 class Bar(Foo): 7 pass 8 print(issubclass(Bar,Base)) 9 10 #isinstance 判断第一个参数对象是否是第二个对象参数的实例 11 class Base(object): 12 pass 13 class Foo(Base): 14 pass 15 obj=Foo() 16 print(isinstance(obj,Foo)) 17 print(isinstance(obj,Base)) 18 obj1=Base() 19 print(isinstance(obj1,Foo)) 20 print(isinstance(obj1,Base)) 21 #type 获取当前对象由那个类创建 22 class Zero(): 23 pass 24 obj=Zero() 25 print(type(obj))
二 科学判断函数还是方法
print 查看
1 from types import FunctionType,MethodType 2 def check(arg): 3 if isinstance(arg,FunctionType): 4 print('是函数') 5 elif isinstance(arg,MethodType): 6 print('是方法') 7 else: 8 print('不知道')
三>
反射
创建一个模块mo
1 f0 = 9 2 def f1(): 3 print("f1") 4 def f2(): 5 print('f2') 6 def f3(): 7 print('f3') 8 def f4(): 9 print('f4') 10 def f5(): 11 print('f5')
创建一个py文件
import mo #mo.f1()#这就是反射 from types import FunctionType while True: print(""" 系统支持的函数有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("请输入要执行的函数:") # val = "f1" if hasattr(mo,val):#根据字符串,判断模块中是否有成员 mo_one=getattr(mo,val)#从mo中找到val与模块成员同名的成员 if isinstance(mo_one,FunctionType): #判断成员是否是函数 mo_one() else: print(mo_one)
关于面向对象的反射练习
class Account:
def login(self):
print('111')
def back(self):
print('222')
def add(self):
print('333')
def run(self):
print("""
请输入要执行的功能:
1. 登录
2. 注销
3. 注册
""")
val = int(input('请输入选择序号'))
func_first = ['login', 'back', 'add']
func_one = func_first[val - 1]
v1=getattr(Account,func_one)#根据字符串形式,去对象中找成员
v1(self)#函数类型 记住 类+方法分为函数
v1 = getattr(Account, func_one) # 根据字符串形式,去类中找成员
v1(self) # 函数类型 记住 类+函数分为函数
#v1 = getattr(self, func_one) # 根据字符串形式,去对象中找成员
#v1() # 函数类型 记住 对象+函数分为方法
obj=Account()
obj.run()
反射补充
getattr 根据字符串形式,去对象找成员
hasarrr 根据字符串,判断对象是否有成员
setsttr 新建一个内部地址创建
del 删除
这两个都不可存贮在内存地址中
1 import yy 2 setattr(yy,'f3',55)#这里传递的是数值,要打印 3 v2=getattr(yy,'f3') 4 print(v2) 5 setattr(yy,'f4',lambda x:x+1) 6 v7=getattr(yy,'f4') 7 print(v7(1))#这里也可以传递参数,内含返回值,需要打印 8 delattr(yy,'f2')#删除f2 9 v1=getattr(yy,'f2')#需要加"" 这里指从字符串中从 10 v1("战旗")
判断是否可被调用
什么后面可以加括号?
函数,类,方法,对象
即这些都意味着可以被调用,因为有__call__
1 def func(): 2 pass 3 class Foo: 4 def __call__(self, *args, **kwargs): 5 pass 6 def func1(self): 7 pass 8 obj=Foo()
print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func1)) 都为TURE
小技巧
#是否是函数,方法 类+函数为函数 对象 + 函数 为方法
#判断是否是函数 前面要声明 from types import FunctionType
# 才可用 isinstance(mo_one,FunctionType) 返回ture 和 false
#判断是否被调用 callable 有括号的意思都可被调用 函数,类,方法,对象
#判断某个类是否是指定类的实例 type
#判断某个类是否是这个类及这个类基类的实例 isinstance