python-获取类名和方法名,动态创建类和方法及属性

一、获取类名和方法名

  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、函数是指一段可以直接被其名称调用的代码块,它可以传入一些参数进行处理并返回一些数据,所有传入函数的数据都是被明确定义

posted @ 2019-11-14 18:14  南方的墙  阅读(15824)  评论(0编辑  收藏  举报