: g9 ^/ p* \8 q' zclass Animal(object): 0 z. }3 T( x* ^ U* r3 D/ c def eat(self):7 z: w- {/ c0 P$ ?4 Q3 F. l
print('动物会吃'), G% l: l. V; O W* W1 g
/ Q9 Y0 q$ a' k
% c. A$ Y9 r5 k' oclass Dog(Animal): / l5 P4 ~4 ?9 C% p% i) `& d def eat(self): ) m& A: i. t2 M8 [ print('够吃骨头') . U) e& x4 F6 x* C$ K" l7 Q5 H" e5 ]7 d0 c( j0 y- k. E9 r# r, m
, C$ e) t; M3 i+ @6 bclass Cat(Animal):) w! O' _; O3 W
def eat(self):" n5 m/ o/ ?4 I# p: N
print('猫吃小鱼')8 @% I( p& M t# L$ w6 m0 p
9 d2 s5 U/ E/ y4 Y+ G$ w7 l0 C
' W4 I) c' t6 i& i+ i$ o
class Person:( z0 E" F. h3 V$ {7 L
def eat(self):9 `* l0 D& n8 f
print('人吃五谷杂粮') / P) h, Y+ w' C; R4 o , F4 @' v, d4 e5 m+ a 3 k/ w: U- U5 |- m; Q# 定义一个函数 " V- z3 K2 F& i0 L# Odef fun(fun1):+ d0 V& f8 K( V9 e# `" n3 B
fun1.eat() # 调用对象的eat()方法 $ z L4 F# U3 o w2 O7 g5 k& {" \! q, M4 s/ M' O; h
3 D" x- e/ D% N1 j0 A7 L
if __name__ == '__main__': & M3 B9 G# N- I7 \ # 开始调用函数# d- t+ ]+ f5 m/ p$ h* \
fun(Animal()) # Cat继承了Animal Dog继承了Animal0 Z+ S- `9 A9 H5 c; M' Q5 x( V
fun(Cat()) # Cat 和Dog是重写了父类中的eat方法,调用了自己重写后的内容5 U& n6 E8 ~9 A7 ]
fun(Dog()) ! S" f B; I0 b& o1 j: U6 w! ^ : r p7 j; \9 ^ print('------------------') 0 J+ n4 e6 `' I fun(Person()) # Person 没有继承关系 但是有eat方法,直接调用eat方法 5 f: q m1 N: ]+ Z2 h _9 ^2 q) G ?+ l u- I3 Y7 j; D$ |9 l& X
14 b0 i9 C% a+ _$ S3 B/ i, t, a
27 h9 k- l/ G% {& T! C
3 3 j! R! H+ A0 J' b0 o# b6 B, D4 b7 s: x: c1 p8 t5 N9 V- J
5# @2 N5 q4 q. e% t
6 R: w5 | x* h77 L, t/ n0 c4 _* V) S
8 : [: F3 M6 H6 V g6 X8 `! I2 Q98 @$ O' U! o* }
10# @5 S! H7 \ T! }
11 z: C2 I( Q" K ?7 \
12" M6 z9 ?1 ^& I; x b
13# N' B; u' ^1 h4 Y
14" M# `3 Y4 B8 G& O9 y2 _
15 5 W) \0 N3 G7 [9 }' ~16 8 f: ?" W# r7 }* A+ H6 ?2 y% F17 3 z, V' n, i" G18 1 K5 d$ ^/ f! H) g6 a19 6 G1 m! Q, A! X1 F20 6 p. L. }0 O0 v) w6 I21 . h' l0 d* P1 e) [; P4 z+ E. o8 _22, N; n- n7 K) X3 C
23% Y: ^1 Z. S# Y' X7 K. j& K
24 0 K9 n6 Q: w1 O25 * X+ T" a/ T, M5 h& J26 1 t& [* R K% |, }. Y; C* Z3 g# ?27 0 \- J( X- B6 ?: K/ R28 ' j4 g, X3 n1 z) v296 ~, {3 J6 ?9 h& k3 [/ ]' s$ {
30 ' h# c- `7 j& k0 M31 " j4 k# U. @- O; z& l320 ]5 R* Q$ [5 g! O) B: V
33- W/ m. i) ?8 s: v
34 ( ^& o" f/ @$ c2 Y0 g35 % s' Y& j- e8 v8 A$ |1 Q36 0 S8 ~3 ^2 c1 X, x$ z! |371 f3 K5 N( A& H4 j- M
385 k; x2 H) N6 u/ p
39$ i3 f; A# Z, V/ [' W( u7 m
40. G# i0 E( q# r# ]7 y& X& I
41 5 n. o; T0 K* a& `" W9 G& Q42 / L+ K0 d1 h) H' N6 j3 d43 $ l, u* V, j1 b, q9 C44 5 \4 S! d D$ `" a3 R* N45 4 ^. |- F' P1 m r46 " H$ V2 p0 ?6 }% v5 M47 9 N/ C' G5 R- u7 F0 P( T4 D2 Q# B2 e. S/ m5 f
+ b7 G" Q( T4 ?: c
1.动态语言与静态语言2 H6 J2 y/ s e* M3 f* O
Python是一门动态语言,可以在创建对象后动态的绑定属性和方法,0 j3 H* D( F$ p; i! P+ I5 V$ D4 {4 l# g
2 @4 o6 o' W/ Q' G静态语言和动态语言关于多态的区别:( D/ W+ G; V+ r% y. p3 k
- g9 W @" o$ q8 E- z静态语言实现多态的三个必要条件(Java). V+ s" ^# n% i, X5 u6 I: ^
1. 继承8 [" C9 ^" u- v& y( e. ?3 k: ~
2. 方法重写 + W0 ^ l1 H; o/ P3. 父类引用指向子类对象 % t4 Q# C' X3 P0 x8 `( U/ E4 w& l! ]5 T0 U _7 m+ e+ W0 f
动态语言:(Python). I) ]% G$ f. [& b8 @2 M3 B
动态语言的多态崇尚 “鸭子类型“ 一只鸟走起来像鸭子,游起来像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心对象是什么类型,到底是不是鸭子,只关心对象的行为’‘’ ; v* [1 d" K7 q( u; p K: q/ V, y9 r% G. B1 f3 H* V
四、类的特殊属性和方法 : w/ I4 n' u4 h" M6 P1.特殊属性/ t$ e0 J2 T8 ?! w
特殊属性 描述" |) l/ T3 v' E6 _% f! Y# x
__dict__ 获得类对象或实例对象所绑定的所有属性的方法的字典 1 N: p3 t1 Z0 z; M! D$ `- `" ]# -*- coding: utf-8 -*-4 d% a; t' h6 K& g
# @File : demo.py# b! Y r" O9 B9 P
# @author: Flyme awei . K! S" j% L' l1 Q+ `6 V0 N$ @# C
# @email : Flymeawei@163.com ( s1 x3 n( f: F; k/ v& C/ H# @Time : 2022/8/15 23:276 x# h8 A- T( e1 ^% ~7 E+ f
$ r& b5 ?! D9 p6 h. x, X3 Q U% s2 I+ C" w3 q' b
# 特殊属性 __dict__ 获得类对象或实例对象所绑定的所有 属性 或 方法 的字典& ?- `. g% w6 w
class A:% R: N. M" |7 V7 S6 e6 G# o
pass" i0 X, X7 T1 @& U) T% Z
; S; F. U3 m) p% \' ?! @% v/ V+ h0 Z: a; v
class B: ( a- |( V2 T( @% X pass; D/ H+ H' K3 B( A) d: p
$ g `& H) L o( {2 q# b# p1 U
1 J; Z8 z7 c4 [+ Fclass C(A, B): , i: L- Q( _+ L! G) G2 \ q def __init__(self, name, age):+ W# v4 x0 k% j" A- U5 x1 A. H
# 实例属性 9 l$ ~5 s; Z! B! H5 L self.name = name * ]. @- U' I7 I8 `; s4 C* \' Z self.age = age + G. h, i( C' T. A0 S- L; n- ^$ }6 |2 e/ A
7 L \' u" ~ ?5 s- mif __name__ == '__main__':1 B: A3 ^# D V8 y
! Q3 t+ ?6 N' f9 k* V # 创建C类的对象8 U. l! s5 f& }3 ~
x = C('Jack', 20) # x是C类的一个实例对象) k* o7 u* x0 _# O$ K
" h) y: _- O" d! z' W print(x.__dict__) # 获得实例对象属性的字典 : Z7 A( X( F$ l9 m print(C.__dict__) # 获得类对象的属性和方法的字典 - A$ n. N8 V4 ~! g* Y8 d+ n print('-----------------'): F3 b, x; b% H; y( b
# t" p% x- _! p. E9 h2 ^3 I
print(x.__class__) # 输出对象所属的类* ^" K% ], |+ V! N- P
print(C.__bases__) # C类父类类型的元组 (<class '__main__.A'>, <class '__main__.B'>)% q+ Y* Y. J# B. o- L! _
print(C.__base__) # 类的基类 离C类最近的父类& A. @" L5 q+ V9 B4 ^( y
print(C.__mro__) # 查看类的层次结构 # Q, U9 [ Z! ?' f, B print(A.__subclasses__()) # 子类的列表+ T1 G/ y; @( Y, ~2 ]: T
; b" h) l" s5 h! p$ N, K0 o
1 4 V) P8 |8 F7 B4 y2. i1 @( B% U; b# E1 o
32 y. V; a I4 e
4 9 n4 [. s J) O$ i5 p: p* z" ]* l1 o2 y! l9 ~( y6 4 m( M) G e5 J9 Y$ I$ _2 g5 a0 U7. f; G$ P- I {. @+ l
83 Z3 l0 p. H- ~: b1 P
97 n2 b* [# V; y- T8 t
10+ a+ a! Q G5 p& z
11) Q/ y7 i! U4 y7 Q2 ^5 l4 a
12 1 u0 _) L1 K2 U; |13 " y0 W- n% A( e( C8 u14 9 [+ K7 ?7 B( ?! ^6 s' y6 z u15 2 m9 n5 y. b; w+ l; P/ v& A165 _9 d; C, E, n5 u: U
177 H# z# n4 s2 w4 y
187 J7 t4 `2 M8 i. [
19 2 }# Q! r0 S+ S" r9 i4 ?) u20 ) | |) h* U1 b1 R21 . i9 L0 L- o) i$ z. R22& G3 t2 W2 e5 i/ C& w# U
23/ X9 L+ L f& t+ p4 t+ e2 x
24 3 F5 \# y6 `1 O! g: w257 V+ P! p# z8 ~6 q3 u3 Y) i
26 / s) O7 V. a7 ?6 Q/ X$ p: l+ p1 u27 / y M3 x* `/ q" e5 f6 `% `' P28- d4 J; i6 |. h# X1 [
29 ) l8 {& G; E# s3 ]305 x( Z* d& O! j @& \3 Q
31- |! z5 V7 p/ [# D2 @: A
322 W0 }, @7 v9 j6 X6 ]8 A
33( }4 X. H4 l' Y
34# G" u0 T2 _ t
35 ' M1 d5 Y( ~$ h& t$ S36 : n, U3 m! [) g+ j37 , a) V' ?% p1 O6 d. c- n385 _0 d& A9 w1 Q+ ^
7 K% }9 t/ U. [: D# a( g: ?
( s: `% t( F! x' S4 S
2.特殊方法 / }, l8 G# ~+ ]特殊方法 描述% b$ @! B6 o( d! a# H- |
__len__() 通过重写 __len__()方法,让内置函数len()的参数可以是自定义类型 + k9 n/ J& _2 k2 Q' b9 N__add__() 通过重写__add__()方法,可以让自定义对象具有+的功能 ) B: P) G/ P& ~& a. I__new__() 用于创建对象 7 U& q! [2 g# S; b__init__() 对创建的对象进行初始化 6 r# |( P, O. `; D' A__len__()方法和 __add__() 方法2 d# o2 X2 x8 f# T& ?' R, A
# -*- coding: utf-8 -*-- }& D* d; G* }2 n6 e
# @File : demo.py: u. v2 W1 M, B5 G
# @author: Flyme awei 0 Y; l) t. B/ I5 Y" z
# @email : Flymeawei@163.com2 ~& u* K. T0 V2 ^+ k& c1 U& c
# @Time : 2022/8/15 23:27! \, D$ P! I9 C7 q! B/ G
) l, [; F) C" z& F2 G- ~" p) q$ j1 u! ]/ l) Q: j6 A
# 1.特殊方法 __add__()) j: A0 A+ i9 B u1 u3 c. }( o; x
# 通过重写 __add__()方法,可以使自定义对象具有 “+” 的功能 . s9 Q6 v! [3 y) ua = 209 {& N/ z7 A, y- C0 O; Y! W- B9 C
b = 100: N1 C5 p) F/ L; I! W6 Z. i
c = a + b # 两个整数类型的对象的相加操作% ~" b9 O5 [2 P! E" r2 L, r G& J3 J
d = a.__add__(b)4 s, {: _1 j' d
print(c)1 t+ v! c2 G, T3 Q+ v7 g; L4 _
print(d)' x" @( g, K% q- [
9 F9 K$ y& U# \. d, [* B. ?