科学判断函数还是方法,反射

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

 

posted @ 2018-08-30 17:26  逆欢  阅读(104)  评论(0编辑  收藏  举报