Python面向对象之反射
2021-07-09 08:07
标签:命名 image 传递参数 stat for style 机制 ble method 一、补充: @classmethod 整个方法中没有用到对象命名空间中的名字,且用到了类的命名空间中的名字(普通方法和属性property除外) 类方法的默认参数:cls 调用这个发方法的类 类方法的调用方式:通过类名调用 通过类名调用的本质是方法 @statimethod 将一个普通函数放到类中来就给这个函数加一个@staticmethod装饰器 这个函数就不需要传默认的参数:self,cls 静态方法的调用方式:通过类名调用 通过类名调用本质是函数 from types import MethodType,FunctionType 配合isinstance使用,判断是方法还是函数 通过类名调用,@classmethod的是方法,@statimethod的是函数 通过对象调用,@classmethod的是方法,@statimethod的是函数 类可以被调用,对象不能被调用 总结: 需要明确传递参数的是function(函数),不需要明确传递参数的是method(函数)。类直接调用是function(函数),类的实例调用的是method(函数) 类方法:类调用和对象调用都是method(函数) 静态方法:类调用和对象调用都是function(函数) 类、对象内存机制的解析 Python面向对象之反射 标签:命名 image 传递参数 stat for style 机制 ble method 原文地址:https://www.cnblogs.com/st-st/p/9567113.htmlfrom 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
‘‘‘
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>
func(f) # 对象 not callable: <__main__.foo object at>
# 判断函数、方法、对象
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}
‘‘‘