11.面向对象(封装、继承、多态)
1、面向对象编程三大特征:封装、继承、多态
1)封装:面向对象编程的第一步 将属性和方法封装到一个抽象的类中,外界使用类创建对象,然后让对象调用方法,对象方法的细节都被封装在类的内部
# 需求:小明爱跑步
# 1.小明体重75.0公斤
# 2.每次跑步会减肥0.5公斤
# 3.每次吃东西体重会增加1公斤
# 4.小美的体重是45.0公斤
class People:
weight=0
name='null'
def __init__(self,tz,name):
# 实例属性
self.weight=tz
self.name=name
def running(self):
self.weight-=0.5
print(f'每次跑步会减肥0.5公斤,现在的体重是{self.weight}')
def eating(self):
self.weight += 1
print(f'每次吃东西体重会增加1公斤,现在的体重是{self.weight}')
xiaoming=People(75,'小明')
xiaoming.running()
xiaoming.eating()
xiaomei=People(45,'小美')
xiaomei.eating()
2)继承
子类拥有父类以及父类的父类中封装的所有属性和方法。
继承分为单继承和多继承
注意:1)子类调用方法,先找自己,再找父类,再找父类的父类,以此类推(如果多继承,则采用就近原则来进行调用)
1)单继承:
class 子类名(父类名):
类主体
重写父类方法有两种方式:
1、覆盖父类的方法
如果在开发过程中,父类方法的实现和子类方法的实现完全不同,就可以使用覆盖的方法在子类中重新编写父类中的方法,在运行中,只会调用在子类中重写的父类的方法而不会调用父类的方法
2、扩展父类方法
如果在开发过程中,子类的方法的实现包含父类的方法的实现,在需要位置使用父类名.方法(self)来调用父类方法的执行,代码其他位置针对子类的需求,编写子类特有的代码实现
class People:
def __init__(self,name,age):
self.name=name
self.age=age
print(self.name,self.age)
def speak(self):
print('父类方法speak')
def sleep(self):
print('父类的sleep方法.....')
class Student(People):
#子类重写父类方法
def speak(self):
# 子类方法需要调用父类方法如何进行调用
People.speak(self)
print('子类重写父类speak方法')
dasheng=Student('大圣',20)
# dasheng.sleep()
dasheng.speak()
2)多继承
class 子类名(父类名1,父类名2):
类主体
class People:
def __init__(self,name,age):
self.name=name
self.age=age
print(self.name,self.age)
def speak(self):
print('父类方法speak')
def sleep(self):
print('父类的sleep方法.....')
class pythonStudent(People):
#子类重写父类方法
def speak(self):
# 子类方法需要调用父类方法如何进行调用
People.speak(self)
print('子类重写pythonStudent父类speak方法')
class javaStudent:
pass
def speak(self):
# 子类方法需要调用父类方法如何进行调用
People.speak(self)
print('子类重写javaStudent父类speak方法')
class student(javaStudent,pythonStudent):
def __init__(self,name):
self.languae='中文'
self.name=name
CR7=student('CR7')
CR7.speak()
3)多态
不同的子类调用相同的方法会执行不同代码(多态)
class wx:
def pay(self):
print('采用微信支付')
class zfb:
def pay(self):
print('采用支付宝支付')
class yl:
def pay(self):
print('采用银联支付')
def start_pay(object):
object.pay()
wx1=wx()
yl1=yl()
zfb1=zfb()
start_pay(zfb1)