封装
示例代码链接: https://blog.csdn.net/god_yutaixin/article/details/102766835
继承
从设计角度讲,肯定是将程序封装成一个个子类,然后再根据需要,把子类中的共性,抽象出一个父类
从编码角度讲,父类必须写在子类的前面,子类才能找到它
示例1
#父类
class Person:
def __init__(self,name):
self.name = name
def say(self):
print('说话')
#子类1
class student(Person):
#子类没有构造函数时,会继承父类的构造函数
pass
s01 = Student() #此时会报错,因为子类继承自父类,在自己代码pass的情况下,实际上是拥有父类的构造函数init__()的,所以需要向__init(self,name)中传一个name参数
s02 = Student(Terry) #此时就对了
s02.say() #子类的实例可以调用父类的方法
#子类2
class Teacher(Person):
#当子类有自己的构造函数时,会覆盖掉父类的构造函数
def __init__(self,age,name):
self.age = age
#当想使用父类的构造函数时,可以使用super().__init__(想要继承的父类的初始化属性)
super().__init__(name)
t01 = Teacher(28,'TT')
print(t01.age)
print(t01.name)
示例2
需要符合面向对象的设计原则:开闭原则:即对扩展开发(写类属于扩展),对修改关闭,增加新功能,不能改变原有代码
#老张开车去东北
#需求变化:坐飞机 | 坐火车 | 骑车
class Person:
def __init__(self,name):
self.name = name
def go_to(self,position,type)
'''
:param position:地名
:param type:去的方法
:return:
'''
print('去:' + position)
#判断怎么走
#如果是飞机就飞,用isinstance()判断该对象是否属于该类
if isinstance(type,Car)
type.run()
#如果是车就跑
#这里修改了代码,违反了面向对象的开闭原则
elif isinstance(type,Airplane):
type.fly()
#这个类只有一个run功能,满足设计原则:类的单一职责,一个类有且只有一个改变它的原因
class Car:
def run(self):
print('走你~')
#添加坐飞机的类,属于加功能,不违反开闭原则,开发时一个个类为一个单元
class Airplane:
def fly(self):
print('嗖~')
c01 = Car()
lz = Person('老张')
lz.go_to('东北',c01) #打印出 '去:东北' '走你~'
a01 = Airplane()
lz.go_to('东北',a01) #打印出 '去,东北' '嗖~'
示例2重构
class Person:
def __init__(self,name):
self.name = name
def go_to(self,position,type)
print('去:' + position)
type.transport(position) #符合开闭原则:对修改关闭,增加新功能,不改变原有代码
#抽象出各种交通工具的父类(依赖倒置:调抽象)
class Vehicle:
def transport(self,position):
pass
class Car(Vehicle):
#继承,对父类的方法进行重写
def transport(self,position):
print('开车到',position)
#对扩展开放
class Airplane(Vehicle):
#继承,对父类的方法进行重写
def transport(self,position):
print('飞到',position)
#之后要使用什么交通工具,只要写该交通工具的类就行了
class Bike:
......
c01 = Car()
a01 = Airplane()
lz = Person('老张')
lz.go_to('东北',a01) #print: '去:东北' '飞到 东北'