面向对象——isinstance/issubclass/type、反射、方法和函数的恩恩怨怨

一、isinstance/issubclass/type:

  1、isinstance(obj,cls):检查obj是否是cls类的对象  

class Base(object):
    pass
class Foo(Base):
    pass
obj1 = Foo()
print(isinstance(obj1,Foo))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj1,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
obj2 = Foo()
print(isinstance(obj2,Foo))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj2,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例

  2、issubclass:检查sub类是否是super类的派生类

class Base(object):
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar,Base)) #检查第一个参数是否是第二个参数的子子孙孙类

  3、type:获取当前对象是由那个类创建

class Foo(object):
    pass
obj = Foo() #结果:<__main__.Foo object at 0x000001EF4AA48198> <class '__main__.Foo'>

print(obj,type(obj)) #获取当前对象是由哪个对象创建
if type(obj) == Foo:
    print("obj是Foo类型")  #结果:obj是Foo类型


#练习
class Foo(object):
    pass
class Bar(object):
    pass
def func(*args):
    foo_count = 0
    bar_count = 0
    for item in args:
        if type(item) == Foo:
            foo_count += 1
        elif type(item) == Bar:
            bar_count += 1
    return foo_count,bar_count
# result = func(Foo(),Bar(),Foo())
# print(result)
v1,v2 = func(Foo(), Bar(), Foo(), Bar())
print(v1,v2)

 

 

 

 

三 、 方法和函数:

  1、看位置

    如果函数在类中,就是方法

       如果函数在类外面,就是函数

  2、调用者

    对象.xxx,xxx就是方法

    类.xxx,xxx就是函数

    xxx,xxx就是函数

  3、代码判断    

from types import MethodType,FunctionType
class Foo:
    def arg(self):
        pass
f = Foo()
def check(arg):
    """
    检查arg是方法还是函数
    :param arg:
    :return:
    """
    if isinstance(arg,MethodType):
        print("arg是一个方法")
    elif isinstance(arg,FunctionType):
        print("arg是一个函数")
    else:
        print("不是函数也不是方法")
check(f.arg)
#结果:arg是一个方法

from types import MethodType,FunctionType
class Foo:
    def arg(self):
        pass
f = Foo()
def check(arg):
    """
    检查arg是方法还是函数
    :param arg:
    :return:
    """
    if isinstance(arg,MethodType):
        print("arg是一个方法")
    elif isinstance(arg,FunctionType):
        print("arg是一个函数")
    else:
        print("不是函数也不是方法")
check(Foo.arg)
#结果:arg是一个函数

 

posted @ 2018-08-30 16:16  LW-5208  阅读(159)  评论(0)    收藏  举报