Python——面向对象——类的继承、多态、封装

[复制链接]
oLjwRgTm 发表于 2017-12-30 20:11:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
类的继承0 |4 A) W( x2 ?7 P: q3 `1 W2 U9 F

  \4 T3 W* d) A8 G1 E) b之前我们讲过了类的基本用法以及权限,今天学习一下类的继承。4 ]; Y6 z# g- M" X
我们简单定义一个继承:9 d# b- t) x/ j" ]
class Mylei(object):4 M  t3 [$ h+ C' X/ U+ r" m
****def firm(object):) S/ m! z9 O: ?  y8 W3 G2 }0 y
********print('六楼俱乐部')' F/ v! q' m$ @7 D- H
class family(Mylei):
( m& Y* ]( M) Z0 F  D/ B****def dz(self):$ B2 o' m6 R0 |& R$ ]
********print('四川成都')9 _. |0 |% Y# ^
address=family()
% |% S" p# y+ R" L  @7 kaddress.dz()
* o. o. G: l- O5 h4 N: xaddress.firm()0 `6 T/ `$ g* e9 Q0 I
在这个继承中 类 family继承了类Mylei,也就是说Mylei是family的继承对象,Mylei称为父类,family称为子类,而Mylei的继承对象是object,而object则是所有继承能追溯到的源头。这样就对大概说明白了什么是继承。
0 \% r5 \  E' F3 X, g) W: r我们看一下刚才那个程序的效果是什么:1 w# ~9 Z" e6 i7 j

" t! i7 m; |( L' c" v类初体验
) U& f9 l- i9 G2 |4 `* }" k" h* H我们可以这样理解,Mylei是父亲,family是儿子,第四行是类的实例化,而第八行是调用family这个类中的dz方法
- ?4 L+ f, d4 p2 }1 F
0 ]! k% h2 e7 |  r8 |第九行怎么能调用父类Mylei中的方法呢,这就是类的特性也是最大的优势,父亲有的一些习性儿子当然有啊!. m. ~2 d5 X7 Y( X9 F0 {) G1 Q
当然了,父亲的所有习性儿子都能拥有的!比如父类的私有方法,子类就不能调用!例如:0 s9 h& K) S" ?* u3 D" Y

; E9 k" Q/ D1 e2 t% E8 u/ A# G不能调用父类私有方法
, c- D& U! H* T8 V( ^- e看,调用父类私有方法就会报错,父亲脚臭,想必儿子不想继承这个传统吧?, p+ B/ _: j; J
多重继承
; }7 D; X% }& m) z( |& g
+ k/ D3 O! R2 C6 `4 M0 Z5 R

7 G. [2 [, b& I- h/ ^  Q3 D多重继承是拥有多个父类,一个子类可以继承多个父类。换句话说,一个儿子可以拥有多个父亲……
8 Q2 W- N+ u3 \2 @/ f% ^3 r$ r! T' F6 t+ e" ~" H, ~
看一个例子就好:4 m/ o+ g8 |3 |% n
class Dad1(object):
: c' w! [" d* F( v2 ^5 M+ S" n% X****def foot(self):
3 A4 m- n, `  X+ x* g********print('脚臭')0 }2 A4 E3 P) T8 z7 i; j
class Dad2(object):* e' ^. d+ L& a( C
****def eye(self):% B2 B) [; n: R, G( V" I' n
********print('小眼睛')
6 R. v/ ?; P, |class Son(Dad1,Dad2):
* j' N$ ?" P6 L****def defect(self):
4 Q, U2 ^  d- k' z( |# |2 E*******print('脚臭眼睛还小')  U. U0 B9 p3 c* i
run=Son()* z6 h% `2 f* `
run.defect(). z- Q: p+ R: |% E
run.foot()
0 r1 B/ r6 T' U1 i3 R% ]run.eye()' l( `5 \. H/ N# G4 x4 ]

" d" l0 t; I/ C7 d7 A/ G9 a( q多重继承
- |1 \; x/ s1 Y5 v6 _% c从上面代码发现了多重继承的好处,子类不仅可以继承多个父类而且还可以拥有父类的所有非私有方法。& Y% U# }6 p: P* N4 G
多态6 N4 P! V, j- g' D- T+ w
" }* E2 O9 M+ z* m" j9 Q- c5 ^
什么是多态呢?多态就是当子类的方法和父类的方法一致时,子类的方法覆盖父类的方法。
* F$ G" m. f; m! t5 J就比如,年轻的时候爸爸时家里顶梁柱,随着年龄增长,父亲干不动了,儿子长大了,儿子就是家里的顶梁柱了$ t: A( V. U; K0 e  D
儿子完全替代了父亲了。
+ f8 l7 i4 H/ ?还是用栗子说话:
) t$ a2 e$ A1 }1 w2 c
& l& ^2 m- y7 A1 p多态. o4 ?/ G( z4 x* d( Q$ A
当父类和子类拥有同一种方法时,子类中的方法会覆盖父类中的方法。5 \0 E% M9 C2 q, s! S
封装& J5 b& ^! a7 g/ H* B

# H9 f! n" g. N; U0 ~. N5 i# ~. S4 |. G% b
封装就是将类封闭起来不让别人看到,用的时候直接调用就可以了。' g) [6 b4 l6 b

  b; Q& B3 l- c2 ~/ g我们还是举一个栗子:
" C" s" G3 z  _, g1 a
4 h' S7 V6 T! W9 W4 a9 f未封装' m* z, \# T. D! c
未封装的类,实例化传入变量后要调用类,则需要在类外部一个函数,这个函数的作用时起到打印的效果。3 F; |1 H, g: v3 {" j. `9 d5 q: @$ A- q
第八行是调用函数,而给函数传入的参数则是第5行run里面的变量,因此第七行变量是run.name 和run.age5 i6 u6 e/ L" g# W! B1 D" s
封装类0 ]# @: C5 }  C$ s" h
如果封装就直接把外部调用类的函数放进类里面,使之变成类的一个方法。9 {! @& I5 M; |/ x; F3 {8 V
举个栗子:0 z$ x9 S# h, a: r: g8 D/ N
+ k0 N7 U) R/ R. B- z1 x
封装类
1 v/ h6 I* m! [; Q1 V这样就把各种数据直接封装到类里面了。
$ B: ~. `# T' R+ y0 x最后
" K3 Q+ G/ }: O: j9 L1 g6 v

( D! o. R- W  l) J
- g. P/ v/ K1 s投个票吧
9 o7 ~# N( W+ y- |% e5 L4 @: ]
: R5 A; d% B8 ]. q8 p这样诙谐幽默通俗易懂的方式能接受吗?& N: e1 I. A, K- ]& E
9 ]( n0 Z7 y8 C: m; N
<div class="mp-vote-box mp-vote-outer" id="mp-vote-5a479fa0fd8b99067e3a1218" data-expire-time="1515161400">    <div class="mp-vote-inner">        <div class="mp-vote-title">是否喜欢这种方式  (单选)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图