如何记录子类的实例化参数

问题描述

我有一个抽象类,该子类是我的子类。抽象类的特征之一是它具有一个属性,该属性存储为实例化该类而输入的所有参数。例如,以下代码实现了我的目标:

class Parent:
    def __init__(self,parent_parameter):
        pass


class Child(Parent):
    def __init__(self,parent_parameter,child_parameter_1,child_parameter_2):
        self.input_params = locals()
        super(Child,self).__init__(parent_parameter)

使用此代码,我可以通过self.input_params属性访问原始输入参数。但是,问题是代码self.input_params = locals()的第一行必须包含在每个子类中。我想要某种解决方案,例如

class Parent:
    def __init__(self,parent_parameter):
        self.input_params = locals()



class Child(Parent):
    def __init__(self,child_parameter_2):
        super(Child,self).__init__(parent_parameter)

基本上,这样编写子类的人就不必注意包含用于参数记录的代码。当然,此块中的代码将仅捕获parent_parameter参数,而没有任何子参数。

当然可以将子参数显式传递给父类__init__,但这打破了实现者不必担心日志记录的要求,并引入了*args**kwargs感觉是多余的。

class Parent:
    def __init__(self,*args,**kwargs):
        self.input_params = locals()



class Child(Parent):
    def __init__(self,self).__init__(parent_parameter,child_parameter_2)

编辑: 也许最好的方法是只记录所需代码

class Parent:
    def __init__(self,parent_parameter):
        # subclass __init__() must begin with `self.input_params = locals()`
        pass


class Child(Parent):
    def __init__(self,self).__init__(parent_parameter)

解决方法

好吧,我认为可以通过覆盖__new__来提出一些可行的方法。如果这是非Python或hacky,或者这是__new__的典型用例,我将不胜感激。

class Parent:
    def __new__(cls,*args,**kwargs):
        input_params = {'args': args,'kwargs': kwargs}
        obj = super(Parent,cls).__new__(cls)
        obj.input_params = input_params
        return obj

    def __init__(self,parent_parameter):
        pass


class Child(Parent):
    def __init__(self,parent_parameter,child_parameter_1,child_parameter_2):
        super(Child,self).__init__(parent_parameter)