因此LSP说,如果S是T的一个子类型,那么S的任何实例都应该能够替换T的任何实例,而不会改变程序的任何理想性质。
这是否意味着这将使LSP失败,因为当您执行dev_1.print_name()(将子类的实例替换为基类-ish的实例)时,您会得到一个意外的结果(失败),因为您还没有初始化名称?
@dataclass
class Employee:
name: str
def print_name(self):
print(self.name)
class Developer(Employee):
def __init__(self, work_from_home: bool):
self.work_from_home = work_from_home
dev_1 = Developer(True)
dev_1.print_name()解决这一问题的方法是将开发人员类更改为类似于Employee类的所有方法?
class Developer(Employee):
def __init__(self, work_from_home: bool, name:str):
self.work_from_home = work_from_home
super().__init__(name)发布于 2022-04-10 13:49:57
你是对的。在编写代码时,创建Employee将需要为其name属性提供一个值。但是正如所写的,在创建name时,您的代码不会初始化Developer。正如您所说,这将导致Developer对象的行为不像Employee对象,因此它违反了LSP。
添加一个为name属性取值的构造函数的解决方案确实解决了这个问题。获得相同行为的标准方法也是将Developer注释为数据类,这样就可以免费获得适当的构造函数:
@dataclass
class Employee:
name: str
def print_name(self):
print(self.name)
@dataclass
class Developer(Employee):
work_from_home: bool
def print_developer(self):
print(f"Developer {self.name} does{'' if self.work_from_home else ' not'} work from home")
def main():
dev_1 = Developer("Jack", False)
dev_1.print_developer()结果:
Developer Jack does not work from home您还可以将Developer对象视为Employee。
emp_1 = Developer("Jill", True)
emp_1.print_name()结果:
Jillhttps://stackoverflow.com/questions/71817124
复制相似问题