python 方法和函数区别/反射

1.方法和函数
    称谓:
  类,方法
  外,函数
到底方法函数?
  对象.xxx --> xxx就是方法
  类.xxx --> xxx就是函数
  xxx --> xxx就是函数
打印查看:
  function
  method

代码检查:

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

2.反射

a. 需求

总结:
v = getattr(obj,"func") # 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员。

练习题:
..

好记:
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)
应用一:

 

from types import FunctionType
    import handler

    while True:
        print("""
    系统支持的函数有:
        1. f1
        2. f2
        3. f3
        4. f4
        5. f5
        """)
    val = input("请输入要执行的函数:") # val = "f1"
        if val == 'f1':
        handler.f1()
    elif val == 'f2':
        handler.f2()
    elif val == 'f3':
        handler.f3()
    elif val == 'f4':
        handler.f4()
    elif val == 'f5':
        handler.f5()            

应用二:

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(Account,func_name) # Account.login
        # func(self)

        func = getattr(self, func_name)  # self.login
        func()

obj1 = Account()
obj1.run()

obj2 = Account()
obj2.run()

 

总结:

反射 *****
issubclass/type/isinstance/ ***
方法和函数 *

问题:你见过的什么后面可以加()?
- 类()
- 对象()
- 函数()
- 方法()
以上所有都可以被调用。

示例:

        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 15:44  一二九  阅读(207)  评论(0编辑  收藏  举报