开-闭原则(目标、总的指导思想)
Open Closed Principle
对扩展开放,对修改关闭。
增加新功能,不改变原有代码。
例如:Man开车去上班,调用Car的run方法,Car的行驶路线可以随意更改,Man去上班的这件事情不用变
类的单一职责(一个类的定义)
Single Responsibility Principle
一个类有且只有一个改变它的原因。
例如:Car只负责运送人,Man只管上班
依赖倒置(依赖抽象)
Dependency Inversion Principle
客户端代码(调用的类)尽量依赖(使用)抽象。
抽象不应该依赖细节,细节应该依赖抽象。
例如:Man上班需要交通工具Vehicle,至于什么交通工具,有啥就是啥
组合复用原则(复用的最佳实践)
Composite Reuse Principle
如果仅仅为了代码复用优先选择组合复用,而非继承复用。
组合的耦合性相对继承低。
例如,Man的交通工具很多,由自行车,摩托车,小汽车,电动车等等,有什么用什么
里氏替换(继承后的重写,指导继承的设计)
Liskov Substitution Principle
父类出现的地方可以被子类替换,在替换后依然保持原功能。
子类要拥有父类的所有功能。
子类在重写父类方法时,尽量选择扩展重写,防止改变了功能。
例如:Bike,Car的run实现各自是不一样的
迪米特法则(类与类交互的原则)
Law of Demeter
不要和陌生人说话。
类与类交互时,在满足功能要求的基础上,传递的数据量越少越好。因为这样可能降低耦合度。
示例:
class Vehicle:
def __init__(self, speed):
self.speed = speed
def run(self):
pass
class Bike(Vehicle):
def run(self):
print("甩起两条小短腿")
class Car(Vehicle):
def run(self):
print("一脚油门的事情")
class Man:
def __init__(self, name, vehicle):
self.name = name
self.vehicle = vehicle
def work(self):
print(self.name, "该去上班了")
self.vehicle.run()
if __name__ == '__main__':
w = Man("老王", Bike(10))
# 老王骑车去上班
w.work()
# 老张开车去上班
z = Man("老张", Car(100))
z.work()