Python学习——面向对象:封装、继承、多态

目录

一、封装

二、继承

三、多态

总结:

须知:


我们都知道像Python、Java、C#、C++等语言都是面向对象(Object Oriented)的语言,而像C语言则是面向过程的语言。面向对象是一种对现实世界理解和抽象的方法,更接近于日常生活和自然的思考方式,在如今的计算机发展领域中,这个概念已经不仅仅局限于软件系统开发了,包括像人工智能、机器学习等领域都适用,因为面向对象有如下优点:

1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合(软件工程的概念)的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
高内聚是指:类与类之间的关系而定,高,意思是他们之间的关系要简单,明了,不要有很强的关系,不然,运行起来就会出问题。
低耦合是指:降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行。

了解完面向对象的优点后,必须要关注一下面向对象的特点:封装、继承、多态。

一、封装

我们常常听到有一些资深的程序员吐槽公司新来的员工写代码不封装,那么到底封装是什么呢?

对于面向对象的封装来说,其实就是使用构造方法将内容封装到对象中然后通过对象直接或者self间接获取被封装的内容

举例如下:

先是函数式编程:函数式编程比起面向过程的写法来说已经很好了,但和面向对象比起来还是有区别,仔细感受一下。

def dalanqiu(name, age, gender):
    print("%s,%s岁,%s,打篮球" %(name, age, gender))


def jianshen(name, age, gender):
    print("%s,%s岁,%s,健身" %(name, age, gender))


def kandianying(name, age, gender):
    print("%s,%s岁,%s,看电影" %(name, age, gender))


dalanqiu('热巴', 26, '女')
jianshen('热巴', 26, '女')
kandianying('热巴', 26, '女')


dalanqiu('娜扎', 27, '女')
jianshen('娜扎', 27, '女')
kandianying('娜扎', 27, '女')

# 这种方式为函数式编程

接下来是面向对象的写法:

class Foo:
    
    def __init__(self, name, age ,gender):   #  这里的self相当于指针,保存调用类的对象的地址
        self.name = name
        self.age = age
        self.gender = gender

    def dalanqiu(self):
        print("%s,%s岁,%s,打篮球" %(self.name, self.age, self.gender))

    def jianshen(self):
        print("%s,%s岁,%s,健身" %(self.name, self.age, self.gender))

    def kandianying(self):
        print("%s,%s岁,%s,看电影" %(self.name, self.age, self.gender))


xiaoming = Foo('热巴', 26, '女')
xiaoming.dalanqiu()
xiaoming.jianshen()
xiaoming.kandianying()

laoli = Foo('娜扎', 27, '女')
laoli.dalanqiu()
laoli.jianshen()
laoli.kandianying()

# 这是面向对象编程

二、继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

  猫可以:喵喵叫、吃、喝、拉、撒

  狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为实现他们所有的功能,如下所示:

class Animal:

    def eat(self):
        print("%s 吃 " %self.name)

    def drink(self):
        print("%s 喝 " %self.name)

    def shit(self):
        print("%s 拉 " %self.name)

    def pee(self):
        print("%s 撒 " %self.name)


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = '猫'

    def cry(self):
        print('喵喵叫')

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = '狗'
        
    def cry(self):
        print('汪汪叫')
        

c1 = Cat('小白家的小黑猫')
c1.eat()

c2 = Cat('小黑的小白猫')
c2.drink()

d1 = Dog('胖子家的小瘦狗')
d1.eat()

我们可以看到对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。在继承父类的同时,子类也可以创建自己的方法。(除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

同时,还有多继承的概念需要了解:

Python的类可以继承多个类,Java和C#中则只能继承一个类

Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

使用何种寻找方法取决于类的类型,有经典类新式类

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

从字面上可以看出一个老一个新,新的必然包含了更多的功能,也是之后推荐大家的写法;从写法上区分的话,如果当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

三、多态

多态一个典型的应用场景:

假如我们使用工厂类,用来输出一本书到底属于谁,如果不用多态,那么有几个人就要建立几个工厂,少还好,如果有个百八十个人,你怎么弄。

Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”

动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

class F1:
    pass  # pass语句有点等价于c语言里的单分号语句,即空语句,啥也不做,啥也没有。


class S1(F1):

    def show(self):
        print('S1.show')


class S2(F1):

    def show(self):
        print('S2.show')

def Func(obj):
    print(obj.show())


s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj) 

# Python “鸭子类型”

总结:

  • 面向对象是一种编程方式,此编程方式的实现是基于对对象的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

须知:

1. C# 和 Java 该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。所以,一般在Python开发中,全部使用面向对象面向对象和函数式混合使用。

2.如果程序中的所有功能都是用对象来实现,那么就是面向对象编程了


参考文章:

https://www.cnblogs.com/wupeiqi/p/4493506.html

https://www.cnblogs.com/chengd/articles/7287528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值