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

[复制链接]
oLjwRgTm 发表于 2017-12-30 20:11:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
类的继承
, l9 z4 O6 e2 `/ Q; H2 v( h9 f, G8 V% W, g% u( I9 `
之前我们讲过了类的基本用法以及权限,今天学习一下类的继承。# i! d$ z) h% K/ s' G4 q9 j# m
我们简单定义一个继承:7 I4 I4 r6 S; a' i/ q
class Mylei(object):( W5 j% X, t& g* D& S5 ]
****def firm(object):
+ f" v) e. K: C********print('六楼俱乐部')
# M/ r% R) Z/ `! W/ K$ }  cclass family(Mylei):
% a: y1 g9 \/ R5 i  S****def dz(self):( F  p' K; m9 _+ Y# e
********print('四川成都')* W' I- E) s; D6 l0 Y2 J
address=family()
( @# A8 I: P. Y* M5 \address.dz()2 W# I3 I$ y2 V. ~0 }
address.firm()% g! \, q. x+ R1 y) \* ?
在这个继承中 类 family继承了类Mylei,也就是说Mylei是family的继承对象,Mylei称为父类,family称为子类,而Mylei的继承对象是object,而object则是所有继承能追溯到的源头。这样就对大概说明白了什么是继承。3 M* b. l& n" y/ m0 L( l$ G0 I3 x7 f, Q
我们看一下刚才那个程序的效果是什么:$ i8 s- |' M3 w

3 }/ W, |( v% o' A( \" I; r$ o& H类初体验* {2 N6 e1 M0 _" m$ ]/ S6 Y
我们可以这样理解,Mylei是父亲,family是儿子,第四行是类的实例化,而第八行是调用family这个类中的dz方法% Q( S; P- F* c

  [- D2 ?" z1 B# h+ D4 u第九行怎么能调用父类Mylei中的方法呢,这就是类的特性也是最大的优势,父亲有的一些习性儿子当然有啊!
6 _- G8 V( _9 q) y( U* K- l当然了,父亲的所有习性儿子都能拥有的!比如父类的私有方法,子类就不能调用!例如:1 w" M6 Q# w' L3 B0 b; @

" R# ~7 E& w% {+ M1 |+ T/ s% N$ X. U$ u不能调用父类私有方法
# Q" h2 T$ q. W9 p看,调用父类私有方法就会报错,父亲脚臭,想必儿子不想继承这个传统吧?
5 L6 s! d/ |/ d  @* Z; ~. b5 U多重继承
% Y" V( G1 [" b( j3 A- i: A7 F' t

' K4 V+ }( y) s, N
; H0 g6 f& w* {: c: n多重继承是拥有多个父类,一个子类可以继承多个父类。换句话说,一个儿子可以拥有多个父亲……: y9 T- I$ X& d/ z, j6 c

3 c, I" K0 D0 c7 E) t2 n看一个例子就好:2 |2 p! E: E9 u6 |* ~, E0 E
class Dad1(object):( H9 M5 ~) I7 W7 H5 H
****def foot(self):
, N4 }1 G4 P& j2 d) U/ p/ k********print('脚臭')! c. i9 G! d2 }) `" ]- d! j
class Dad2(object):6 a! E, _+ u5 G- g  ?
****def eye(self):& `* u* C/ J! O! q
********print('小眼睛'); \' K* ?8 n2 j; B% s
class Son(Dad1,Dad2):( M- `4 V# V4 B
****def defect(self):3 b  k3 H9 X. f- F, I( R
*******print('脚臭眼睛还小')& |% W0 _# x) p; L# K. z. }
run=Son()9 M2 K# R  b" W' a
run.defect()
9 L0 h$ e4 u: j: vrun.foot()
3 L8 g7 N4 W. trun.eye(). a9 E; }- e: M1 t  e9 k% k- J

/ y  A8 A+ F0 d* ?2 L9 M& T多重继承
" z, p; \  D' g+ [1 [0 ^从上面代码发现了多重继承的好处,子类不仅可以继承多个父类而且还可以拥有父类的所有非私有方法。
3 b" Z0 s  b  g1 B. T多态' W, [4 J3 m3 s- k# E

1 b# h2 ^1 U# U0 z1 W( c什么是多态呢?多态就是当子类的方法和父类的方法一致时,子类的方法覆盖父类的方法。: A: Y0 J/ l' n8 L$ @
就比如,年轻的时候爸爸时家里顶梁柱,随着年龄增长,父亲干不动了,儿子长大了,儿子就是家里的顶梁柱了9 b. Q& E& e( ~, B. f0 V/ r
儿子完全替代了父亲了。$ m) Y) A% Q3 ~
还是用栗子说话:& j- j5 }( y& I) g  E3 A

4 C" B1 W* Y  Z# h多态; C8 t3 `) H" k& X: R0 x0 L3 Z2 D. D
当父类和子类拥有同一种方法时,子类中的方法会覆盖父类中的方法。. L) k) j  \$ f2 t
封装) y( G& u4 s# G! m* T
; p/ T5 @/ p) O/ l% B
2 k1 j$ z! H* s2 [3 q( Y0 u
封装就是将类封闭起来不让别人看到,用的时候直接调用就可以了。
- j4 F. c# h! z
- L+ c- H" S& B. k; ~我们还是举一个栗子:
9 M% l$ B/ p! x" j% r! X% t1 e9 k( Q! Q' [* r; J+ R
未封装
/ n+ c( I' G5 c, X* Z9 E未封装的类,实例化传入变量后要调用类,则需要在类外部一个函数,这个函数的作用时起到打印的效果。4 \- s" X8 \- P# Y0 U3 o
第八行是调用函数,而给函数传入的参数则是第5行run里面的变量,因此第七行变量是run.name 和run.age
- L6 U* D) f9 M( Q封装类
; X7 M. |. c; }& @/ m8 W1 N如果封装就直接把外部调用类的函数放进类里面,使之变成类的一个方法。5 }3 M! D; i+ v1 |6 |# l* G5 r$ e- Z: e
举个栗子:% B  R- O( G" a

5 M$ I  `. ]% Q' Y8 ~# |封装类* ^1 _) W& E+ O# P- [
这样就把各种数据直接封装到类里面了。
* E/ r" Q# ~2 S4 S最后0 C* J, m2 D- V9 o8 |6 B/ f
. F- u$ f; Y5 ?+ \9 X. p9 b8 y

4 A7 P2 {; n- r5 f投个票吧
/ n) a9 W+ U7 [
9 R* a  i# G# A; a& P这样诙谐幽默通俗易懂的方式能接受吗?
$ X  y- {4 D. ^* A" w4 i( t' t, h6 }& e: Z: ]2 B
<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.|网站地图