尝试为子类创建默认参数

问题描述 投票:0回答:1

我想创建一个能够创建子类的类。这是代码示例:

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 类型)

python python-3.x default-value
1个回答
0
投票

我使用 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 使代码编写变得更加困难,因为你不知道可能存在哪些参数。

对这段代码有什么想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.