我想创建一个能够创建子类的类。这是代码示例:
class System:
def __init__(self, a=0, b=0, c=0):
self.a, self.b, self.c = a, b, c
self.sub_systems = []
def create_sub_sys(self, a=None, b=None, c=None):
if a is None: a = self.a
if b is None: b = self.b
if c is None: c = self.c
ss = System(a, b, c)
self.sub_systems += [ss]
return ss
s = System(a=10, b=100, c=-19)
s1 = s.create_sub_sys() # want it to be exact same system, so a, b, c = 10, 100, -19
s2 = s.create_sub_sys(b=3) # create system with a, b, c = 10, 3, -19
s21 = s2.create_sub_sys(a=3, c=3) # so a, b, c all are 3. 'b' parameter inherits from a 's2' class
print(s1.a, s1.b, s1.c)
print(s2.a, s2.b, s2.c)
print(s21.a, s21.b, s21.c)
因此,如果用户没有向该子类提供参数,则子类应该像父类一样采用参数。上面的代码可以工作,但看起来制作很差。如果我有很多参数,就会有很多行代码。而且,我发布的这个程序正在检查参数是否为“无”。但我正在制作一个程序,其中“无”实际上意味着某些东西(程序不应分配父母参数),因此代码将无法工作。
提出问题其实很难,但希望你能看懂代码。所以我想要的系统应该检查用户是否使用了该类的某些参数。如果是这样,它将覆盖默认给出的父级。如果没有,它将离开父母。也许你可以给我建议如何改进它,使其更通用(代码中没有指出,即使我愿意,我也不能将子项的某些参数设置为 None 类型)
我使用 kwargs 的解决方案:
class System:
def __init__(self, a=0, b=0, c=0):
self.kw = locals()
self.kw.pop('self') # no need to have self as a parameter
self.a, self.b, self.c = a, b, c
self.sub_systems = []
def create_sub_sys(self, **kwargs):
self.kw.update(kwargs) # if user give some parameters, self.kw will be updated
ss = System(**self.kw)
self.sub_systems += [ss]
return ss
s = System(a=10, b=100, c=-19)
s1 = s.create_sub_sys() # want it to be exact same system, so a, b, c = 10, 100, -19
s2 = s.create_sub_sys(b=3) # create system with a, b, c = 10, 3, -19
s21 = s2.create_sub_sys(a=3, c=3) # so a, b, c all are 3
print(s1.a, s1.b, s1.c)
print(s2.a, s2.b, s2.c)
print(s21.a, s21.b, s21.c)
我能看到的唯一问题是 create_sub_sys 参数 kw 使代码编写变得更加困难,因为你不知道可能存在哪些参数。
对这段代码有什么想法吗?