零基础学PythonDay16 Python面向对象

Posted 光于前裕于后

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础学PythonDay16 Python面向对象相关的知识,希望对你有一定的参考价值。

昨天跟大家一起学习了Python异常处理,回顾之前内容看这里 零基础学Python,今天让我们开始学习Python面向对象吧。
需注意的是,【零基础学Python】此系列都使用Python3。


面向对象

说面向对象之前,我们先聊下什么是对象,对象可不是你的五指姑娘,对象是类的实例,而类可以理解为一个抽象概况的东西,比如动物是一个类,那么狮子、老虎、大象就是动物类实例化出的对象,再比如狮子是一个类,那么克鲁格狮、喀麦隆狮、肯尼亚狮、加丹加狮就是狮子类实例化出的对象。对象是相较于类更具体的东西。


我们定义了一个父亲类,在初始化__init__(self, height, iq=100, eq=100)时定义了三个属性,身高,IQ和EQ,并赋予IQ和EQ平均水平100。此外,还定义了两个方法说话和走路。heidou = Father(165, 110, 80)是实例化的一个父亲,他165、IQ110、EQ80,他会说话,也会走路。

>>> class Father:
...     def __init__(self, height, iq=100, eq=100):
...         self.height = height
...         self.iq = iq
...         self.__eq = eq
...     def speak(self):
...         print('说话', self)
...     def run():
...         print('走路')
...
>>> heidou = Father(165, 110, 80)
>>> heidou.speak()
说话 <__main__.Father object at 0x000001ABAB0F12B0>
>>> heidou.run()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: run() takes 0 positional arguments but 1 was given

但是run()走路报错了,因为调用类里方法时,会传递一个类的实例,我在speak()方法中打印出来了,<main.Father object at 0x000001ABAB0F12B0>就是Father类的实例对象heidou,而run()方法没有参数,heidou传不进去就报错了。

通过前面介绍,大家应该能感觉出来,对象是一个抽象的东西,也更符合人类的思维方式,而面向对象就是指偏向于抽象的编程方式,因为一旦具体化,所写的代码复用性就会很差,维护也会更麻烦。面向对象对应的是面向过程,像C语言就是面向过程的编程语言,面向过程就是偏向于具体的编程方式,比如盖房子,先一层层打地基,再一层层垒墙,最后封顶。如果是面向对象的思考方式,打地基、垒墙和封顶都可以抽象出来,里面是人+不同的方法+不同的材质,盖不同的房子就是不同的组合。

说到面向对象,就不得不提面向对象的三大特性:继承、封装和多态。

封装
确保对象中的数据安全,下面以EQ为例,__eq,私有属性前面加两个下划线,外部无法直接获取,

>>> class Father:
...     def __init__(self, height, iq=100, eq=100):
...         self.height = height
...         self.iq = iq
...         self.__eq = eq
...     def speak(self):
...         print('说话', self.iq)
...     def run():
...         print('走路')
...     def set_eq(self, eq):
...         self.__eq = eq
...     def get_eq(self):
...         return self.__eq
...
>>> heidou = Father(165, 110, 80)
>>> heidou.iq
110
>>> heidou.eq
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Father' object has no attribute 'eq'
>>> heidou.__eq
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Father' object has no attribute '__eq'
# 其实私有属性也可以访问,但不建议这么做
>>> heidou._Father__eq
80
>>> heidou.get_eq()
80
>>> heidou.set_eq(85)
>>> heidou.get_eq()
85

继承
保证对象的可扩展性,节省代码,维护简单

class Father:
    def __init__(self, height, iq=100, eq=100):
        self.height = height
        self.iq = iq
        self.__eq = eq
    def speak(self):
        print('说话', self.iq)
    def run():
        print('走路')
    def set_eq(self, eq):
        self.__eq = eq
    def get_eq(self):
        return self.__eq

class Son(Father):
    pass

>>> heizui = Son()
>>> heizui = Son(175, 100, 100)
>>> heizui.iq
100
>>> heizui.speak()
说话 100

我们又定义了一个儿子Son类,class Son(Father) 它继承了父亲的方法,现在实例化出一个身高175、IQ和EQ都是100的黑嘴,在Son类中不用定义任何方法,直接继承了父类的方法。

多态
多态听着就不像人话,其实就是多样性。多态的产生有两个必要条件,继承和方法重写,也就是子类重写了父类的方法。上面讲继承的时候大家可以看到,只要子类继承了父类,就会继承父类中的所有方法,但就像在实际生活中一样,孩子肯定是青出于蓝而胜于蓝的,子类可以重写父类的方法,虽然方法名一样,但是可以各用各的。

>>> class Father:
...     def __init__(self, height, iq=100, eq=100):
...         self.height = height
...         self.iq = iq
...         self.__eq = eq
...     def speak(self):
...         print('说话', self.iq)
...     def run():
...         print('走路')
...     def set_eq(self, eq):
...         self.__eq = eq
...     def get_eq(self):
...         return self.__eq
...
>>> class Son(Father):
...     def speak(self):
...         print('黑嘴会唱黄昏')
...
>>> heidou = Father(165, 110, 80)
>>> heidou.speak()
说话 110
>>> heizui = Son(175, 100, 100)
>>> heizui.speak()
黑嘴会唱黄昏

兄弟姐妹们学废了吗

以上是关于零基础学PythonDay16 Python面向对象的主要内容,如果未能解决你的问题,请参考以下文章

零基础学PythonDay16 Python面向对象

零基础学PythonDay2 Python基本语法

零基础学PythonDay2 Python基本语法

零基础学PythonDay9 Python推导式

零基础学PythonDay9 Python推导式

零基础学PythonDay9 Python推导式