写在前面:
今天接着昨天的写面向对象的三大特性,分别讲解封装、继承、多态。
同时给大家推荐一个学习的网站链接:菜鸟教程-python面向对象
三大特性:封装、继承、多态。
1.对象都有明确的边界,把属性和方法保护在边界之内。(安全性)
2.封装的力度适中。
3.封装的原则
(1)将不需要对外提供的内容进行隐藏。
(2)隐藏属性,提供公共的方法对其访问
私有属性:__name="xxx"
继承是父类与子类的关系,比如狗类和二哈,狗类就是父类,二哈是子类。
(1)定义形式(类的完整形式)
class 子类的类名(父类的类名):
属性
方法
(2)父类:基类,超类
object————顶层类
如果对象没有书写继承关系,默认继承object
(3)继承的特点
举例:用子类创建的对象调用父类的属性和方法
# 定义父类
class A:
name1 = "父类的属性1"
def aa(self):
print("父类的方法1")
# 定义子类
class B(A):
name2 = "子类的属性1"
def bb(self):
print("子类的方法1")
n = B()
print(n.name2) #调用子类的属性
n.bb() #调用子类的方法
print(n.name1) #调用父类的属性
n.aa() #调用父类的方法
执行结果为:
子类的属性1
子类的方法1
父类的属性1
父类的方法1
可扩展性。父类扩展了,子类也得到扩展。
如果子类没有构造方法,对象会去调用父类的。
如果子类有自己的构造方法,则不会去调用父类的。
子类的构造方法可以调用父类的构造方法,调用可以有以下两种方式:
父类的类名.__init__(self) #手动传递self
super().__init__() #不需要加self
一个子类可以继承多个父类。
# 定义父类A
class A:
name_a = "父类A的属性1"
def aa(self):
print("父类A的方法1")
# 定义父类B
class B:
name_b = "父类B的属性1"
def bb(self):
print("父类B的方法1")
#定义子类C
class C(A,B): #继承两个父类
pass #跳过
n = C()
print(n.name_a)
print(n.name_b)
n.aa()
n.bb()
执行结果为:
父类A的属性1
父类B的属性1
父类A的方法1
父类B的方法1
注:多继承有好有坏,优点是增强了可拓展性,缺点则是继承关系复杂之后容易混乱逻辑,难看懂,同时也会占用大量资源,比如著名的钻石继承问题,主要涉及mro和C3算法,不懂的可以百度一下。
(4)方法覆盖
#定义父类
class Animal:
def eat(self):
print("动物会吃东西")
#定义子类狗
class dog(Animal):
def eat(self):
print("狗会吃东西")
d = dog()
d.eat()
执行结果为:
狗会吃东西
子类覆盖了覆盖的方法之后,本质上并没有替换父类的方法,父类的方法依然存在并可以给其他子类调用。
方法覆盖的前提:子类的方法名必须和父类的完全相同
(5)方法重载
出现多个方法名一样的方法(函数),Python中通过默认值进行方法重载。
多态:一类事物有多种形态,是一种使用对象的方式,子类重写父类的方法,调用不同的子类对象的相同父类的方法,可以产生不同的效果。
举例:以王者荣耀选英雄为例,英雄类(Hero)为父类,该父类中有一个方法叫stroke(技能);程咬金和后裔分别为两个子类,两个子类中也有stroke这个方法;调用者为另一个父类,有一个选择英雄的方法,该方法需要调用stroke这个类方法,最后调用不同的子类(程咬金或后裔)对象,得到不同的技能描述。
#定义父类Hero
class Hero :
def stroke(self): #技能函数
print("英雄技能")
#定义子类程咬金
class ChengYaoJin(Hero):
def stroke(self): #技能函数
print("一技能跳跃,二技能旋转,大招回血")
#定义子类后裔
class HouYi(Hero):
def stroke(self): #技能函数
print("一技能多发,二技能射圈,大招大鸟眩晕")
#定义调用者
class Person:
def chose_hero(self,hero): #玩家选择英雄
hero.stroke()
c = ChengYaoJin() #程咬金
x = HouYi() #后裔
p = Person() #玩家
p.chose_hero(c) #玩家选择程咬金,"c"换成"x"就会产生不同的结果
执行结果为:
一技能跳跃,二技能旋转,大招回血
多态性:向不同的对象发送不同的信息,不同的对象接收到信息后,会做出不同的反应。
#定义鸟类
class Bird:
def fly(self):
print("鸟会飞")
#定义飞机类
class Plane:
def fly(self):
print("飞机会飞")
#定义火箭类
class Rocket:
def fly(self):
print("火箭会飞")
#函数调用父类的fly方法
def fun1(obj):
obj.fly()
fun1(Bird()) #调用鸟类的fly方法
fun1(Plane()) #调用飞机类的fly方法
fun1(Rocket()) #调用火箭类的fly方法
执行结果为:
鸟会飞
飞机会飞
火箭会飞
持续更新中!