Python面向對象之反射
阿新 • • 發佈:2018-08-31
被調用 img count bsp python面向對 pre python true 類方法
一、補充:
@classmethod
整個方法中沒有用到對象命名空間中的名字,且用到了類的命名空間中的名字(普通方法和屬性property除外)
類方法的默認參數:cls 調用這個發方法的類
類方法的調用方式:通過類名調用
通過類名調用的本質是方法
@statimethod
將一個普通函數放到類中來就給這個函數加一個@staticmethod裝飾器
這個函數就不需要傳默認的參數:self,cls
靜態方法的調用方式:通過類名調用
通過類名調用本質是函數
from types import MethodType,FunctionType 配合isinstance使用,判斷是方法還是函數
通過類名調用,@classmethod的是方法,@statimethod的是函數
from types import FunctionType,MethodType class Foo: @classmethod def func1(cls):pass @staticmethod def func2():pass print(‘Foo.func1-Function:‘,isinstance(Foo.func1,FunctionType)) # 判斷類方法是否函數 print(‘Foo.func1-Method:‘,isinstance(Foo.func1,MethodType)) #判斷類方法是否方法 print(‘----------------------------------------‘) print(‘Foo.func2-Function:‘,isinstance(Foo.func2,FunctionType)) # 判斷靜態方法是否函數 print(‘Foo.func2-Method:‘,isinstance(Foo.func2,MethodType)) # 判斷靜態方法是否方法 ‘‘‘ Foo.func1-Function: False Foo.func1-Method: True ---------------------------------------- Foo.func2-Function: True Foo.func2-Method: False‘‘‘
通過對象調用,@classmethod的是方法,@statimethod的是函數
from types import FunctionType,MethodType class Foo: @classmethod def func1(cls):pass @staticmethod def func2():pass f = Foo() print(‘Foo.func1-Function:‘,isinstance(f.func1,FunctionType)) # 判斷對象類方法是否函數 print(‘Foo.func1-Method:‘,isinstance(f.func1,MethodType)) # 判斷對象類方法是否方法 print(‘----------------------------------------‘) print(‘Foo.func2-Function:‘,isinstance(f.func2,FunctionType)) # 判斷對象靜態方法是否函數 print(‘Foo.func2-Method:‘,isinstance(f.func2,MethodType)) # 判斷對象靜態方法是否方法 ‘‘‘ Foo.func1-Function: False Foo.func1-Method: True ---------------------------------------- Foo.func2-Function: True Foo.func2-Method: False ‘‘‘
類可以被調用,對象不能被調用
def func(args): if callable(args): print(args()) else: print(‘not callable:‘,args) class Foo:pass f = Foo() func(Foo) # 類 <__main__.Foo object at 0x0000016AE645C278> func(f) # 對象 not callable: <__main__.Foo object at 0x0000016AE645C320>
總結:
需要明確傳遞參數的是function(函數),不需要明確傳遞參數的是method(函數)。類直接調用是function(函數),類的實例調用的是method(函數)
類方法:類調用和對象調用都是method(函數)
靜態方法:類調用和對象調用都是function(函數)
# 判斷函數、方法、對象 from types import MethodType,FunctionType def func(*args): function_count = 0 method_count = 0 foo_obj = 0 for item in args: if isinstance(item,FunctionType):function_count += 1 elif isinstance(item,MethodType):method_count += 1 elif isinstance(item,Foo):foo_obj += 1 return {‘function_count‘: function_count, ‘method_count‘: method_count, ‘foo_obj‘: foo_obj} def func1():pass class Foo: def method1(self):pass f1 = Foo() ret = func(func1,f1.method1,Foo.method1,Foo(),func,f1) print(ret) ‘‘‘ {‘function_count‘: 3, ‘method_count‘: 1, ‘foo_obj‘: 2} ‘‘‘
類、對象內存機制的解析
Python面向對象之反射