zoukankan      html  css  js  c++  java
  • issubclass/type/isinstance、方法和函数、反射

    一、issubclass/type/isinstance

    1、issubclass:检查第一个参数是否是第二个参数的 子子孙孙类(类的确定)

     1 class Base(object):
     2     pass
     3 
     4 class Foo(Base):
     5     pass
     6 
     7 class Bar(Foo):
     8     pass
     9 
    10 print(issubclass(Bar,Base))  #检查第一个参数是否是第二个参数的 子子孙孙类

    2、type:判断当前对象是由哪个类创建的

    1 class Base:
    2     pass
    3 
    4 obj=Base()
    5 if type(obj)==Base:
    6     print("当前对象是Base类创建的")

    3、isinstance:检查第一个参数(对象)是否是第二个参数(类及父类)的实例。(确定实例和类的关系)

     1 class Base(object):
     2     pass
     3 
     4 class Foo(Base):
     5     pass
     6 
     7 obj1 = Foo()
     8 print(isinstance(obj1,Foo))  # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
     9 print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
    10 
    11 
    12 obj2 = Base()
    13 print(isinstance(obj2,Foo))  # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
    14 print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

    二、方法和函数
    1、判断是方法还是函数

     1 from type import MethodType FunctionType
     2 def check(arg):
     3     if isinstance(MethodType,arg):
     4         print("这是方法")
     5     if isinstance(FunctionType,arg):
     6         print("这是函数")
     7     else:
     8         print("什么也不是")
     9 
    10 def func()
    11     pass
    12 
    13 class Foo:
    14     def tital(self):
    15         pass
    16     @staticmethod
    17     def hand()
    18         pass
    19 
    20 check(func) #判断func是函数还是方法
    21 
    22 obj=Foo()
    23 check(obj.tital) # 如果是Foo.tital,则结果是一个函数
    24 check(obj.hand)    # 如果是Foo.hand,则结果是一个函数

    简单一句话:如果是 格式是:类.xxx 则xxx是函数,如果格式是:对象.xxx,则xxx是方法
    2、特点

     1 class Foo(object):
     2 
     3     def f1(self):
     4         pass
     5 
     6     def f2(self):
     7         pass
     8 
     9     def f3(self):
    10         pass
    11 
    12 
    13 obj = Foo()
    14 Foo.f1(obj) # 把f1当做函数 需要手动传self值
    15 
    16 obj = Foo()
    17 obj.f1()    # 把f1当做方法,自动传self值

    3、练习题

     1 class Foo(object):
     2 
     3     def f1(self):
     4         pass
     5 
     6     def f2(self):
     7         pass
     8 
     9     def f3(self):
    10         pass
    11 
    12     list_display = [f1,f2]
    13 
    14 obj = Foo()
    15 Foo.list_display.append(obj.f3)
    16 
    17 for item in Foo.list_display:
    18     print(item)
    19 
    20 #结果:
    21 #function Foo.f1 at 0x0000020AA92BCB70>
    22 #<function Foo.f2 at 0x0000020AA92BCD08>
    23 #<bound method Foo.f3 of <__main__.Foo object at 0x0000020AA90F55F8>>

    三、判断是否可以被调用
     类()、函数()、方法()、对象(),都可以可以被调用

    callable()

     1 def func()
     2     pass
     3 
     4 class Foo:
     5     def titer(self):
     6         pass
     7 
     8     def __call__(self, *args, **kwargs):
     9         pass
    10 
    11 obj=Foo()
    12 
    13 print(callable(Foo))
    14 print(callable(func))
    15 print(callable(obj))
    16 print(callable(obj.titer))    

    四、反射

    1、反射示例——模块

     1 ###handre###
     2 f0 = 9
     3 
     4 def f1():
     5     print('F1')
     6 
     7 def f2():
     8     print('F2')
     9 
    10 def f3():
    11     print('F3')
    12 
    13 def f4():
    14     print('F4')
    15 
    16 def f5():
    17     print('F5')
     1 from types import FunctionType
     2 import handre
     3 while True:
     4     print(
     5         """系统支持的函数有:
     6         1,f1
     7         2,f2
     8         3,f3
     9         4,f4
    10         5,f5      
    11         """
    12     )
    13     val=input("请选择要运行的函数")
    14 
    15     if hasattr(handre,val):
    16         get_atter=getattr(handre,val)
    17         if isinstance(get_atter,FunctionType):
    18             get_atter()
    19         else:
    20             print(get_atter)
    21 
    22     else:
    23         print("请输入正确的格式")

     2、反射示例——面向对象

     1 class Foo:
     2     f0 = 9
     3     num_list = ["f1", "f2", "f3", "f4", "f5"]
     4     def f1(self):
     5         print('F1')
     6 
     7     def f2(self):
     8         print('F2')
     9 
    10     def f3(self):
    11         print('F3')
    12 
    13     def f4(self):
    14         print('F4')
    15 
    16     def f5(self):
    17         print('F5')
    18     def run(self):
    19 
    20         while True:
    21             print("""系统支持的函数有:
    22             1,f1
    23             2,f2
    24             3,f3
    25             4,f4
    26             5,f5
    27             """)
    28             num=int(input("请输入序号"))
    29             name=Foo.num_list[num-1]
    30             method_name=getattr(Foo,name)  # 根据字符串到指定的类去找
    31             method_name(self)    # 类 调用需要手动传参
    32 
    33             #method_name=getattr(self,name)  # 根据字符串到指定的对象去找
    34             #method_name()    # 自动传参
    35 
    36 obj=Foo()
    37 obj.run()    
  • 相关阅读:
    MyGeneration的NHibernate代码生成模版
    ASP.NET页面控制回车触发按钮
    操作NHibernate进行多事务并发处理的一些小经验
    mysql之sql_mode =only_full_group_by 设置问题
    1、一维数组排序
    使用正则表达式构造定制的HTML5输入框
    JavaScript加密库CryptoJS的使用
    安全密码存储,该怎么做,不该怎么做?
    google 站内搜索
    导入导出xls数据
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9561236.html
Copyright © 2011-2022 走看看