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

Python 如何记录子类的实例化参数,python,abstract-class,Python,Abstract Class,我有一个抽象类,它是我的子类。抽象类的一个特性是它有一个属性,该属性存储为实例化该类而输入的所有参数。例如,以下代码实现了我的目标: class Parent: def __init__(self, parent_parameter): pass class Child(Parent): def __init__(self, parent_parameter, child_parameter_1, child_parameter_2): sel

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

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, parent_parameter, child_parameter_1, child_parameter_2):
        super(Child, self).__init__(parent_parameter)
基本上,无论是谁编写子类,都不需要注意包含用于参数日志记录的代码。当然,此块中的代码只捕获父参数,而不捕获子参数

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

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



class Child(Parent):
    def __init__(self, parent_parameter, child_parameter_1, child_parameter_2):
        super(Child, self).__init__(parent_parameter, child_parameter_1, 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, parent_parameter, child_parameter_1, child_parameter_2):
        self.input_params = locals()
        super(Child, self).__init__(parent_parameter)

好的,我想我可以通过重写
\uuuuu new\uuuuuu
找到一些有效的方法。如果这是非音速的或有黑客行为的,或者这是
\uuuu new\uuuu
的典型用例,我将非常感谢您的反馈

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)

您的第二块代码可能无论如何都无法满足您的需求。由于父实现中不存在参数的名称,因此它们也不存在于locals()中。在这种情况下,您从
locals()
中得到的结果如下:
{'self':,'parent_参数:'1,'args':(2,3),'kwargs':{}
-我从未见过
locals()
以这种方式使用。我不知道该怎么办。@Steve是的,没错。第二个代码块没有适当的行为。它展示了我希望最终工作代码具有的那种风格。也就是说,所有日志代码都是在
父类
中以某种方式处理的,而
子类
不必担心它。当然,我需要的是有效的代码,而不是无效的代码。此外,我也不确定
locals()
是否正确。如果有更好的方法捕获输入参数(无需在
Child
类中明确列出它们,我以前一直在这样做…),我很高兴听到这个消息。