面向对象的三大特性-python

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

执行结果为:

鸟会飞
飞机会飞
火箭会飞

持续更新中!

你可能感兴趣的:(Python,python,开发语言)