一、获取类名和方法名
1.在函数外部获取函数名称,用func.__name__获取
2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取
3.使用inspect模块动态获取当前运行的函数名,return inspect.stack()[1][3]需要封装个方法在被测函数中调用
4.在类内部获取类名称self.__class__.__name__
import inspect,sys
def test1():
#获取正在运行函数(或方法)名称
return inspect.stack()[1][3]
def test2():
#获取当前函数(或方法)名称
print(sys._getframe().f_code.co_name)
#调用test1函数
print(test1())
5.获取函数信息
import inspect
#函数信息
def test1():
pass
print("函数信息:",inspect.getfullargspec(test1))
#函数的入参出参信息
def test2(a:"描述",b:object,c:int=None,d:str='http') -> str:
print("函数的入参出参信息:",test2.__annotations__)
test2(a=1,b='2')
二、动态创建类和方法及属性
1.使用type动态创建类
type('child_example', (class_example,), {'echo': echo}) #(类名,继承,属性)
type() #可以被用来动态创建class,这是因为实际上type是一个metaclass
def __init__(self,name,age):
self.name = name
self.age = age
Dog_class = type("Dog",(object,),{"role":"dog","__init__":__init__}) #动态添加属性与方法
d = Dog_class('shuzf',22)
print(type(Dog_class))
print(type(d))
print(d.role,d.name,d.age)
out:
<class 'type'>
<class '__main__.Dog'>
dog shuzf 22
2.使用setattr() 动态创建方法、属性
class A():
name = 'python'
@classmethod
def funcmethod(cls):
return 'Hello world:funcmethod'
setattr(A, 'age',30) #创建变量并赋值,可在下次直接使用
setattr(A,'funcmethod_class',A.funcmethod) #创建变量并赋值方法
方法和函数的区别:
1、方法是特殊的函数,可以说是函数的子集
2、方法常常是和类有关的,是面向对象语言中会用到的,需要通过对象或类调用
3、函数是指一段可以直接被其名称调用的代码块,它可以传入一些参数进行处理并返回一些数据,所有传入函数的数据都是被明确定义