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
类中明确列出它们,我以前一直在这样做…),我很高兴听到这个消息。