1. 程式人生 > >Python面向對象之反射

Python面向對象之反射

被調用 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面向對象之反射