zoukankan      html  css  js  c++  java
  • 科学判断函数还是方法,反射

    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
  • 相关阅读:
    算法笔记_148:有向图欧拉回路求解(Java)
    算法笔记_147:有向图欧拉回路判断应用(Java)
    算法笔记_146:TarJan算法的应用(Java)
    算法笔记_145:拓扑排序的应用(Java)
    第十六章、例行性工作排程 (crontab)
    第十五章、磁碟配额(Quota)与进阶文件系统管理
    第十四章、Linux 账号管理与 ACL 权限配置
    第十三章、学习 Shell Scripts
    第十二章、正规表示法与文件格式化处理
    第十一章、认识与学习 BASH
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/9561494.html
Copyright © 2011-2022 走看看