文档章节

Python 学习笔记 - 面向对象(封装,继承和多态)

乐搏学院
 乐搏学院
发布于 2017/04/05 14:24
字数 1241
阅读 18
收藏 0

之前学习的编程方式都是通过面向过程来实现的,对于一些重用的代码,进一步的使用了函数,增强了代码的可读性和重用性。Python同时还支持面向对象的编程。

 

面向对象有三大特性:

  1. 封装

  2. 继承

  3. 多态

 

首先来看看封装。封装包括两点,把内容封装到某个地方;调用封装的内容

 

例1;

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

class c1:

    def __init__(self,name,obj):

        self.name = name

        self.obj = obj

class c2:

    def __init__(self,name,age):

        self.name = name

        self.age = age

    def show(self):

        print(self.name)

        return 123

class c3:

    def __init__(self, a1):

        self.money = 123

        self.aaa = a1

c2_obj = c2('aa'11)

# c2_obj是c2类型

# - name = "aa"

# - age = 11

c1_obj = c1("alex", c2_obj)

# c1_obj 是c1 类型

# - name = "alex"

# - obj = c2_obj

c3_obj = c3(c1_obj)

# 使用c3_obj执行show方法

ret = c3_obj.aaa.obj.show()

print(ret)

print(c3_obj.money)

---------

aa

123

123

几个注意事项:

  • 我定义了3个类,每个类都有自己的构造方法__init__,我对每一个类都进行实例化一个对象;每个对象创建的时候会自动调用自己的__init__方法封装不同的内容;

  • self是一个形式参数,他就相当于实例,比如当c1_obj=c1('alex',c2_obj),self就等于c1_obj

  • 当我们输出money这个字段的时候,c3_obj可以调用show这个方法输出money(间接调用self)或者直接输出c3_obj.money(直接调用)

  • 对象本身也可以当做参数传给其他的类

     

 

封装的概念有了,如果还记得前面学的pickle,我们可以把自定义的结构序列化保存到一个文件中。

s1.py

1

2

3

4

5

6

7

8

class Foo:

    def __init__(self, name):

        self.name = name

    def show(self):

        print(self.name)

import pickle

obj = Foo('alex')

pickle.dump(obj, open('db','wb'))

 

如果在另外一个文件里面调用这个pickle序列化的文件,必须导入对应的类,不然无法识别

s2.py

1

2

3

4

5

6

import pickle

from s1 import Foo

ret = pickle.load(open('db','rb'))

print(ret)

---------------

<s1.Foo object at 0x000001E5F421BEB8>

 

 

接下来看看继承,子类可以继承父类的所有东西。

 

首先看看单继承的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class F1: # 父类,基类

    def show(self):

        print('show')

    def foo(self):

        print(self.name)

class F2(F1): # 子类,派生类

    def __init__(self, name):

        self.name = name

    def bar(self):

        print('bar')

    def show(self):

        print('F2.show')

obj = F2('alex')

obj.show()

obj.foo()

---------

F2.show

alex

注意要点:

  • F2是F1的子类

  • 创建obj对象的时候,他自动调用F2的构造函数,当他尝试调用foo()方法的时候,首先看自己有没有,如果没有就去父类寻找。类似的,当调用show()的时候,因为自己已经有了,因此直接调用自己的

     

 

看看另外一个例子,原理一样,子类的对象调用方法的时候,self是指向的子类对象,因此他的顺序始终是从子类开始寻找的,找不到才去父类找

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class S1:

    def F1(self):

        self.F2()

    def F2(self):

        print("S1.f2")

class S2(S1):

    def F3(self):

        self.F1()

    def F2(self):

        print("S2.f2")

obj = S2()

obj.F3()

obj = S1()

obj.F1()

-------------

S2.f2

S1.f2

 

接下来看看python特有的多继承,格式很简单C1(C2,C3)表示C1同时继承C2和C3

当多继承的类里面进行调用的时候,遵循的原则有2点,如果是下图左边的情景,那么先在左边做完深度遍历再去找右边的父类;如果是右边的情景,有共同的祖先,那么通过左边到祖先的下面,然后通过右边的父类直到祖先

 

wKiom1fvQP2jqq0lAABVvzUV2Ng304.png

 

例如,

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class C_2:

    def f2(self):

        print('C-2')

class C_1(C_2):

    def f12(self):

        print('C-1')

class C0(C_2):

    def f2(self):

        print('C0')

class C1(C0):

    def f1(self):

        print('C1')

class C2(C_1):

    def f12(self):

        print('C2')

class C3(C1,C2):

    def f3(self):

        pass

obj = C3()

obj.f2()

-----

C0

 

 

最后看看多态。Python里面原生态的支持多态,比如传入参数的时候不需要指定类型,可以是任何数据类型;而类似的方式在Java或者C#里面需要通过继承来实现同一方法传入不同数据类型的参数

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class F1:

    pass

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)

-------------

S1.show

None

S2.show

None

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1858275

© 著作权归作者所有

乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
Python是面向对象的语言吗?python编程

  Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写...

老男孩Linux培训
2018/06/08
8
0
Python3基础之学习笔记(七)-面向对象

文章目录 1. 面向对象 1. 面向对象 1.1 面向对象介绍 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计),面向对象编程是一种编程方式,此编程方式需要使用 “类” 和 “...

GoldenKitten
01/15
0
0
D06——C语言基础学PYTHON

C语言基础学习PYTHON——基础学习D06 20180821内容纲要:  面向对象初级学习     1 面向对象     2 类       (1)封装       (2)继承       (3)多态    ...

m1racle
2018/08/22
0
0
PYTHON面向对象章节深入讲解-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83581748 PYTHON面向对象章节深入讲解—73人已学习 课程介绍 介绍了类和面向对象...

安静的技术控
2018/08/24
0
0
python面向对象笔记(what)

python面向对象笔记(what) 1.什么是面向对象? 对象相当于把函数和全局变量封装起来,属相相当于全局变量,方法相当于函数。 不同对象相互隔离,全局变量互不影响。 2.什么是隐藏属性? 在方...

PowerMichael
2018/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部