零基础学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面向对象的主要内容,如果未能解决你的问题,请参考以下文章