如何获取传入Python类方法的参数字典?
类方法中获取参数字典的方法
对于普通函数,我们可以通过locals()直接获取传入的参数字典:
def my_func(a, b): print(locals())
调用my_func(a=1, b=2)时,会输出{'a': 1, 'b': 2}。
如果是类中的方法,需要根据方法类型做不同处理:
1. 实例方法
实例方法第一个参数默认是self,需排除这个参数后获取目标字典:
class MyClass: def my_function(self, a, b): # 复制本地变量字典并移除self params = locals().copy() del params['self'] print(params) obj = MyClass() obj.my_function(a=1, b=2) # 输出 {'a': 1, 'b': 2}
2. 类方法(@classmethod修饰)
类方法第一个参数是cls,同样需要排除该参数:
class MyClass: @classmethod def my_function(cls, a, b): params = locals().copy() del params['cls'] print(params) MyClass.my_function(a=1, b=2) # 输出 {'a': 1, 'b': 2}
3. 静态方法(@staticmethod修饰)
静态方法没有默认的self或cls参数,直接使用locals()即可:
class MyClass: @staticmethod def my_function(a, b): print(locals()) MyClass.my_function(a=1, b=2) # 输出 {'a': 1, 'b': 2}
也可以借助inspect模块实现更通用的逻辑,自动识别并过滤方法的默认首个参数:
import inspect class MyClass: def my_instance_method(self, a, b): sig = inspect.signature(self.my_instance_method) params = {k: v for k, v in locals().items() if k in sig.parameters and k != 'self'} print(params) @classmethod def my_class_method(cls, a, b): sig = inspect.signature(cls.my_class_method) params = {k: v for k, v in locals().items() if k in sig.parameters and k != 'cls'} print(params) obj = MyClass() obj.my_instance_method(a=1, b=2) # 输出 {'a': 1, 'b': 2} MyClass.my_class_method(a=1, b=2) # 输出 {'a': 1, 'b': 2}
内容的提问来源于stack exchange,提问作者Eduardo Gomes
相关产品推荐
相关产品推荐

