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

[复制链接]
oLjwRgTm 发表于 2017-12-30 20:11:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
类的继承# W0 E0 r0 g9 s) G! w% b& ~5 I
: Z& h8 b) i, w% d, |
之前我们讲过了类的基本用法以及权限,今天学习一下类的继承。  V6 @' d  o# Z- U
我们简单定义一个继承:
- H& x* o" i$ U3 N& x! f
class Mylei(object):& U/ k- l% N2 w* W/ X$ w& ^
****def firm(object):
9 [/ J7 r& N8 t5 ?5 Y- }( c  P********print('六楼俱乐部')
, b: _; M( N9 _) I4 j6 a/ A0 t2 Jclass family(Mylei):
* V: U3 E5 U! e# U& ~****def dz(self):$ [; a8 r6 ^) X6 W
********print('四川成都')
* s# M3 P4 w! i7 h. Z4 W! }' B. }address=family()
  }, O, o2 ]$ c6 ]6 G; |! Taddress.dz()7 h3 T9 R/ b7 [& }, `
address.firm()  t; }1 q! n( J: ?$ }! O4 ?
在这个继承中 类 family继承了类Mylei,也就是说Mylei是family的继承对象,Mylei称为父类,family称为子类,而Mylei的继承对象是object,而object则是所有继承能追溯到的源头。这样就对大概说明白了什么是继承。
) A3 W- [. W: a我们看一下刚才那个程序的效果是什么:" I' i, M/ S  O+ @+ P+ G

9 u) _1 ~5 I0 {9 K类初体验5 _$ i; u' d# B* q$ S) ~1 j
我们可以这样理解,Mylei是父亲,family是儿子,第四行是类的实例化,而第八行是调用family这个类中的dz方法: z+ r' @1 g, |5 v9 N- C

1 \5 I2 B' Y2 s5 n# C0 A$ \' t第九行怎么能调用父类Mylei中的方法呢,这就是类的特性也是最大的优势,父亲有的一些习性儿子当然有啊!
  n& F2 C5 p( x1 M3 u当然了,父亲的所有习性儿子都能拥有的!比如父类的私有方法,子类就不能调用!例如:
" K  E! T$ T, A' D- A$ d. C  Z
( w+ T2 q+ P+ W* e2 g# \' ]( `不能调用父类私有方法+ M) F+ d/ ]1 r5 O
看,调用父类私有方法就会报错,父亲脚臭,想必儿子不想继承这个传统吧?
6 b8 G9 U0 z& U) e0 B1 u5 i' G多重继承  _+ D- b( {0 p7 T. Z

4 a+ ]# @- j. ^% j, E" Z
( k4 D1 R- |. U$ V多重继承是拥有多个父类,一个子类可以继承多个父类。换句话说,一个儿子可以拥有多个父亲……) K: |' {2 k6 v' d/ u" Z2 b! R

9 }+ ^' F: J+ D  D看一个例子就好:
6 h( n: m; f* |3 @. z
class Dad1(object):
% A5 e6 k+ O: |0 a0 {$ F6 B. b****def foot(self):$ A+ k/ K9 }+ Q2 y7 m  t" W! t
********print('脚臭')2 Z- y, a: t: j9 o9 d) {( u
class Dad2(object):4 ~# t# J: z/ O# P5 L- X# K/ U0 N
****def eye(self):
$ l& i5 G' `& w( m; _3 w! i********print('小眼睛')- }3 X+ |( [% [7 Z- [+ A9 S: B
class Son(Dad1,Dad2):
1 b6 ~7 [7 U+ g, G" K) S: `****def defect(self):* r& P2 P0 k, r" @1 y
*******print('脚臭眼睛还小')
9 m2 P. l& G1 Y% W: Vrun=Son()) ], T+ e; N$ L  z) t
run.defect()
  A6 ?$ e0 Z9 K9 [" O0 i- erun.foot()
( u8 b% y# L1 W5 f+ Frun.eye()
! @, l) ~$ [: [3 z
% H& p8 \5 L$ ?3 t
多重继承. B. i3 o- v5 R, o% d% b4 W
从上面代码发现了多重继承的好处,子类不仅可以继承多个父类而且还可以拥有父类的所有非私有方法。7 p6 T  E- ^* s0 u0 X( g0 O' ^# _
多态
% p/ V) Q+ c, ?( u' q- j+ r+ y+ d* c) T+ r
什么是多态呢?多态就是当子类的方法和父类的方法一致时,子类的方法覆盖父类的方法。3 D) @* O0 @0 Y
就比如,年轻的时候爸爸时家里顶梁柱,随着年龄增长,父亲干不动了,儿子长大了,儿子就是家里的顶梁柱了- C6 u* ^9 s: J/ ]6 M2 m
儿子完全替代了父亲了。( C- F" ~: g( Y$ [; |, g
还是用栗子说话:1 A; j4 w: S0 s' j+ _+ W! Y

1 x+ u- ^5 }) W4 J! h多态
: k1 J% r1 Q/ }当父类和子类拥有同一种方法时,子类中的方法会覆盖父类中的方法。3 _( c$ |8 T6 p( f
封装) C- d, r+ q2 L# z$ ~% f( m
+ b1 n3 w. ^% N. M  a# I) U" t
8 Q$ [' O( k# p4 }) S( m9 }# e
封装就是将类封闭起来不让别人看到,用的时候直接调用就可以了。  V- D- K& O+ z* n9 K* T
* m% ^/ g7 n0 ]$ _$ Q3 Q; z
我们还是举一个栗子:
0 \$ R6 E% |9 B7 i! c
4 |2 M) Z/ l2 D- J* C未封装
4 o5 m3 G% L' H1 m! a6 ]未封装的类,实例化传入变量后要调用类,则需要在类外部一个函数,这个函数的作用时起到打印的效果。
8 o/ @+ Q7 m7 a) K. U  z" L5 B第八行是调用函数,而给函数传入的参数则是第5行run里面的变量,因此第七行变量是run.name 和run.age
8 A  e/ W" H7 [, K7 ~封装类
. L' |& r2 v" H8 n如果封装就直接把外部调用类的函数放进类里面,使之变成类的一个方法。5 A0 Z. ]6 Y: l
举个栗子:
1 u) J5 a$ d" Y# ^) q
! a; x5 R9 A5 [' B9 {3 ^封装类. U1 A0 I9 w$ D5 j
这样就把各种数据直接封装到类里面了。
( p; [2 s8 J. U  A7 J5 U. B最后9 i. n" `. \& C1 ~0 b. ^) L
& N/ }; w6 m# A, c) B9 O

. u. j0 E7 s9 J" y' _投个票吧
2 h% s$ p6 c( B; x4 m& B& l3 c
% i' n1 i" b6 L8 H# k这样诙谐幽默通俗易懂的方式能接受吗?+ M4 w( }1 |; ]2 ]6 I
$ r8 g- c& @. K
<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.|网站地图