【问题标题】:Better way to pass default arguments to subclasses将默认参数传递给子类的更好方法
【发布时间】:2021-08-01 22:49:41
【问题描述】:

假设我有一些我的子类,它有一些默认的(可能是类似标志的)参数。处理传递这样一个论点的最佳方法是什么?我可以考虑做

class Dog():
    def __init__(self, noisy = False):
        self.noisy = noisy

    def bark(self):
        if self.noisy:
            print('YAP')
        else:
            print('yap')

class Beagle(Dog):
    def __init__(self, noisy = False):
       super().__init__(noisy)
    
dave = Beagle(noisy = True)
dave.bark()

但是这个用了七次noisy,感觉肯定有更好的办法。

【问题讨论】:

  • 你的意思可能是超类?
  • 您就是这样做的。你不喜欢什么?注意,如果Beagle不需要任何其他__init__处理,你可以完全跳过这个函数,它会继承原来的。

标签: python python-3.x inheritance super


【解决方案1】:

首先,你可以在Beagle()的实例化中去掉noisy =,这是不需要的:

dave = Beagle(True)

其次,鉴于您的实现,您的 Beagle 类没有理由存在。它不添加任何功能,也不以任何方式专门化Dog。如果有的话,Dog 的可能子类是有意义的:

class NoisyDog(Dog):
    def __init__(self):
       super().__init__(True)

class QuietDog(Dog):
    def __init__(self):
       super().__init__(False)

您也可以在对super().__init__() 的调用中保留noisy= 以获得更好的可读性,但同样不需要这样做。

除此之外,您真的无能为力。如果需要类属性,则必须将其分配给类 (self.foo = bar),然后使用其名称引用它...

【讨论】:

  • 感谢您的启发,我想我以后会使用那些简短的子类,很好。
猜你喜欢
  • 2019-03-25
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2016-06-14
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多