【发布时间】:2020-07-24 02:50:59
【问题描述】:
我对在 python 中使用继承时我认为潜在的坏习惯有疑问
假设我有一个基类
class FourLeggedAnimal():
def __init__(self, name):
self.name = name
self.number_of_legs = 4
还有两个子类
class Cat(FourLeggedAnimal):
def __init__(self, name):
super().__init__(name)
def claw_the_furniture(self):
for leg in range(self.number_of_legs):
print("scratch")
class Dog(FourLeggedAnimal):
def __init__(self, name):
super().__init__(name)
def run_in_sleep(self):
for leg in range(self.number_of_legs):
self.move_leg(leg)
def move_leg(i):
pass
出于本示例的目的,我打算将Animal 保留在与Cat 不同的不同文件 中。对于阅读Cat 或Dog 类的代码的人,使用number_of_legs 属性但未在文件中定义。我的理解是最好不要有定义不透明的变量(这就是为什么最好避免from x import *。
我认为替代方案是在两个子类中重复定义 self.number_of_legs,但这违背了继承的目的。
是否有处理这种情况的最佳实践?
【问题讨论】:
-
一个评论,我建议。
-
我不能 100% 确定是否每个人都会同意我的观点,但从工作经验中我了解到,我的很多同事实际上更喜欢从某些文件中抽象出变量(这意味着它们是在别处定义)。在我看来,我认为这种风格没有任何问题,并且实际上更喜欢它。大多数 IDE 还将有一个“转到定义”选项,其他人可以看到该变量的定义位置。再说一次,只是我个人的看法。
-
定义并不是真正的“不透明”。
number_of_legs由self限定,所以如果它没有在子类中定义,那么它必须在超类中定义。重复定义充其量是没有帮助的,并且可能会导致错误。
标签: python oop inheritance module object-oriented-analysis