面向对象的三大特性 您所在的位置:网站首页 繁体字数据集 面向对象的三大特性

面向对象的三大特性

2023-03-16 03:22| 来源: 网络整理| 查看: 265

写在前面: 今天接着昨天的写面向对象的三大特性,分别讲解封装、继承、多态。 同时给大家推荐一个学习的网站链接:菜鸟教程-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方法

执行结果为:

鸟会飞 飞机会飞 火箭会飞

持续更新中!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有