将默认参数传递给子类的更好方法
Better way to pass default arguments to subclasses
假设我有一些 class 子class,它有一些默认的(可能是类似标志的)参数。处理传递此类参数的最佳方法是什么?我可以考虑做
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()
的实例化中去掉noisy =
,这是不需要的:
dave = Beagle(True)
其次,鉴于您的实施,您的 Beagle
class 没有理由存在。它不添加任何功能,也不以任何方式专门化 Dog
。如果有的话,Dog
的可能子 classes 是有意义的:
class NoisyDog(Dog):
def __init__(self):
super().__init__(True)
class QuietDog(Dog):
def __init__(self):
super().__init__(False)
您也可以在 super().__init__()
的调用中保留 noisy=
以获得更好的可读性,但同样不需要这样做。
除此之外,您真的无能为力。如果您需要 class 属性,您必须将其分配给 class (self.foo = bar
),然后使用其名称引用它...
假设我有一些 class 子class,它有一些默认的(可能是类似标志的)参数。处理传递此类参数的最佳方法是什么?我可以考虑做
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()
的实例化中去掉noisy =
,这是不需要的:
dave = Beagle(True)
其次,鉴于您的实施,您的 Beagle
class 没有理由存在。它不添加任何功能,也不以任何方式专门化 Dog
。如果有的话,Dog
的可能子 classes 是有意义的:
class NoisyDog(Dog):
def __init__(self):
super().__init__(True)
class QuietDog(Dog):
def __init__(self):
super().__init__(False)
您也可以在 super().__init__()
的调用中保留 noisy=
以获得更好的可读性,但同样不需要这样做。
除此之外,您真的无能为力。如果您需要 class 属性,您必须将其分配给 class (self.foo = bar
),然后使用其名称引用它...