方法和函数,isinstance/issubclass/type以及反射

一丶,isinstance/issubclass/type

  1.issubclass检查第一个参数是否是第二个参数的 子子孙孙类

class Foo():
    pass
class Boo(Foo):
    pass
class Aoo(Boo):
    pass
print(issubclass(Boo,Foo))      #True
print(issubclass(Aoo,Foo))      #True

  2.type获取当前对象是由那个类创建。

class Foo(object):
    pass

obj = Foo()

print(obj,type(obj))     #<__main__.Foo object at 0x000001B58F579D68> <class '__main__.Foo'>
if type(obj) == Foo:
    print('obj是Foo类型')  #obj是Foo类型

  type练习

class Foo(object):
    pass

class Bar(object):
    pass

def func(*args):
    foo_counter =0
    bar_counter =0
    for item in args:
        if type(item) == Foo:
            foo_counter += 1
        elif type(item) == Bar:
            bar_counter += 1
    return foo_counter,bar_counter

result = func(Foo(),Bar(),Foo())
print(result)   #(2, 1)

v1,v2 = func(Foo(),Bar(),Foo())
print(v1,v2)    #2 1
type练习

  3.isinstance,检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

class Base(object):
    pass

class Foo(Base):
    pass

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

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

 

  

 二丶方法和函数

   称谓:

    类,方法

    外,函数

  到底什么是方法,什么是函数?

    对象.xxx  --->  xxx就是方法

    类.xxx    ---> xxx就是函数

    xxx  --->  xxx就是函数

  打印查看:

    function

    method

 

代码演示:

from types import MethodType,FunctionType
class Foo:
    def display(self):
        pass
def check(arg):
    """
    检查arg是方法还是函数?
    :param arg:
    :return:
    """
    if isinstance(arg,MethodType):
        print('arg是一个方法')
    elif isinstance(arg,FunctionType):
        print('arg是一个函数')
        
    else:
        print('不知道是什么')
check(check)        #arg是一个函数
obj = Foo()
check(obj.display)      #arg是一个方法

 

三丶反射 

  1.getattr : 根据字符串的形式,去对象中找成员

class Foo(object):

    country = "中国"

    def func(self):
        pass
v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。
print(v)    #<function Foo.func at 0x000001E1A557D8C8>

obj = Foo()
v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。
print(v)    #<bound method Foo.func of <__main__.Foo object at 0x000001E1A5579F28>>

  2.hasattr : 根据字符串的形式,去判断对象中是否有成员.

a = 123
class Foo(object):
    country = "中国"
    def func(self):
        pass
v2 = hasattr(Foo,"a")       #判断Foo中是否有a成员
v3 = hasattr(Foo,'country') #判断Foo中是否有country成员
v4 = hasattr(Foo,"func")    #判断Foo中是否有func成员
v5 = hasattr(Foo,'xxxxxxx')

print(v2,v3,v4,v5)    # False True True False

  3.setattr : 根据字符串的形式,动态的设置一个成员(内存)

# 根据字符串的形式,动态的设置一个成员(内存)
x1 = 123
class Foo:
    def f1(arg):
        print(arg,666)

setattr(Foo,'x2',999)
v1 = getattr(Foo,'x2')
print(v1)   #999

  4.根据字符串的形式,动态的删除一个成员(内存)

x1 = 123
class Foo:
    def f1(arg):
        print(arg,666)
delattr(Foo,'x1')
v9 = getattr(Foo,'x1')
print(v9)

  应用

class Account(object):
    func_list = ['login', 'logout', 'register']

    def login(self):
        """
        登录
        :return:
        """
        print('登录111')

    def logout(self):
        """
        注销
        :return:
        """
        print('注销111')

    def register(self):
        """
        注册
        :return:
        """
        print('注册111')

    def run(self):
        """
        主代码
        :return:
        """
        print("""
            请输入要执行的功能:
                1. 登录
                2. 注销
                3. 注册
        """)

        choice = int(input('请输入要执行的序号:'))
        func_name = Account.func_list[choice-1]
        func = getattr(self, func_name)  # self.login
        func()

obj1 = Account()
obj1.run()

obj2 = Account()
obj2.run()
应用

 四丶callable 判断是否可以调用

def func():
    pass

class Foo(object):
    def __call__(self, *args, **kwargs):
        pass
    def func(self):
        pass
obj = Foo()

print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))

 

posted @ 2018-08-30 17:26  七寸丶  阅读(298)  评论(0编辑  收藏  举报