写在前面:
今天接着昨天的写面向对象的三大特性,分别讲解封装、继承、多态。
同时给大家推荐一个学习的网站链接:菜鸟教程-python面向对象
面向对象的三大特性
三大特性:封装、继承、多态。
1.封装
1.对象都有明确的边界,把属性和方法保护在边界之内。(安全性)
2.封装的力度适中。
3.封装的原则
(1)将不需要对外提供的内容进行隐藏。 (2)隐藏属性,提供公共的方法对其访问 私有属性:__name="xxx"
2.继承
继承是父类与子类的关系,比如狗类和二哈,狗类就是父类,二哈是子类。
(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中通过默认值进行方法重载。
3.多态和多态性
多态:一类事物有多种形态,是一种使用对象的方式,子类重写父类的方法,调用不同的子类对象的相同父类的方法,可以产生不同的效果。
举例:以王者荣耀选英雄为例,英雄类(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方法
执行结果为:
鸟会飞 飞机会飞 火箭会飞
持续更新中!