找回密码
 注册
关于网站域名变更的通知
查看: 395|回复: 1
打印 上一主题 下一主题

给深度学习入门者的Python快速教程基础篇之 类(Class)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-16 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
给深度学习入门者的Python快速教程基础篇之 类(Class)7 M* k3 `; n/ Q" a
类(Class)$ X# @$ U/ i( @8 j  B2 o

) G, V8 @" f3 f7 `Python中的类的概念和其他语言相比没什么不同,比较特殊的是protected和private在Python中是没有明确限制的,一个惯例是用单下划线开头的表示protected,用双下划线开头的表示private:  U0 D( s3 y  V, {# R  P4 {
class A:
, ^/ i: ~. W, u"""Class A"""$ E, S" s; A: R7 e" P3 _5 ]
def __init__(self, x, y, name):
$ u; R6 G1 t4 G( sself.x = x5 N# c$ `4 I& c
self.y = y6 H( W+ m* p- |- O. t/ x( {
self._name = name4 ^9 H& M' e+ q$ r: [, U

1 i& h; O" }) ], I3 r, Y( Ddef introduce(self):" p# t; E( ^. [8 x
print(self._name)
/ u0 ?# j; v8 c. E- ]/ \) S$ z0 B3 d& v
def greeting(self):
# F8 d3 N8 t' B; q5 {print("What's up!")
6 G1 E5 @, k" g. X* \, ?# T4 v4 W
+ c! \7 T% s! ^! ?0 ~1 N0 Fdef __l2norm(self):  g+ N3 H$ ~3 a! y" I) E
return self.x**2 + self.y**28 S# c# k5 q1 ^: X9 T9 }

* ~8 |, C* ?" [% Q. Rdef cal_l2norm(self):
0 {! [: w  L, l2 ^4 F9 F) C5 `% ]. oreturn self.__l2norm()
7 u+ r7 ?1 S, Q3 e/ b) [. J* [! J. g2 Q
a = A(11, 11, 'Leonardo')
; I8 y  Q' Y( [. Xprint(A.__doc__) # "Class A"( U, `4 y) x$ o0 `
a.introduce() # "Leonardo"( T5 v/ P( u# C
a.greeting() # "What's up!"  e- ^# `" T3 }
print(a._name) # 可以正常访问
2 R$ [! W2 l! N* P  c% W/ {print(a.cal_l2norm()) # 输出11*11+11*11=242- g( w. `& H1 A, l, r
print(a._A__l2norm()) # 仍然可以访问,只是名字不一样* u( _* A3 l' p+ B3 J( c$ C* [  @
print(a.__l2norm()) # 报错: 'A' object has no attribute '__l2norm'
( _, z5 s% J# H( ]+ G+ A, V, P2 u: |! X
类的初始化使用的是__init__(self,),所有成员变量都是self的,所以以self.开头。可以看到,单下划线开头的变量是可以直接访问的,而双下划线开头的变量则触发了Python中一种叫做name mangling的机制,其实就是名字变了下,仍然可以通过前边加上“_类名”的方式访问。也就是说Python中变量的访问权限都是靠自觉的。类定义中紧跟着类名字下一行的字符串叫做docstring,可以写一些用于描述类的介绍,如果有定义则通过“类名.__doc__”访问。这种前后都加双下划线访问的是特殊的变量/方法,除了__doc__和__init__还有很多,这里就不展开讲了。3 P; `$ J& Z/ N' t8 m% S" {

5 Y* R# A7 h1 X( C: dPython中的继承也非常简单,最基本的继承方式就是定义类的时候把父类往括号里一放就行了:) h# b0 H* g3 b+ T, C" L
class B(A):
4 e  ]' t% }" q, m9 E2 h8 M"""Class B inheritenced from A"""
$ F) ^' b$ g- Ndef greeting(self):% x2 Y+ H8 J% j* ]% \0 c* i# k
print("How's going!")
% u1 m* Y3 Q8 J3 L0 p: f" |: g
2 u+ ~8 Q4 u: @! r8 |( mb = B(12, 12, 'Flaubert')( n9 ?8 w& u% j/ W) M; j
b.introduce() # Flaubert
" |# |; R) w* d' [# ]7 |b.greeting() # How's going!
) ]4 p/ u. o# X, ]0 T. Gprint(b._name()) # Flaubert
, |4 r1 j' ]0 Tprint(b._A__l2norm()) # “私有”方法,必须通过_A__l2norm访问
1 s" t- P7 o0 d0 d  V4 U) j# }9 P( u, ?7 E; g% \! X8 T
map, reduce和filter
8 ]3 @+ D# G4 L. U# j( A$ p
7 j( U/ ^; g; R% a1 t* ^map可以用于对可遍历结构的每个元素执行同样的操作,批量操作:
. f) }2 j! G+ x4 |map(lambda x: x**2, [1, 2, 3, 4]) # [1, 4, 9, 16]6 P- w% T5 Q. j+ ^7 I

( E  l8 B+ V: dmap(lambda x, y: x + y, [1, 2, 3], [5, 6, 7]) # [6, 8, 10]" U3 w7 Y/ |. k4 z# O- w( t
+ a6 f( A& Z9 E1 T: h0 ]7 V
reduce则是对可遍历结构的元素按顺序进行两个输入参数的操作,并且每次的结果保存作为下次操作的第一个输入参数,还没有遍历的元素作为第二个输入参数。这样的结果就是把一串可遍历的值,减少(reduce)成一个对象:
5 h) J3 Q. S3 U8 Sreduce(lambda x, y: x + y, [1, 2, 3, 4]) # ((1+2)+3)+4=10
. }0 a1 d* Z8 B- i
5 X) `- S. p" a0 J' p3 G+ k3 Xfilter顾名思义,根据条件对可遍历结构进行筛选:
( Y7 z+ a3 `; P9 ]' _" _" Z# sfilter(lambda x: x % 2, [1, 2, 3, 4, 5]) # 筛选奇数,[1, 3, 5]1 w) e" f) Y: H

* e# x5 d. Q" x* M* K需要注意的是,对于filter和map,在Python2中返回结果是列表,Python3中是生成器。
3 n! L$ T: }% L  C+ c0 r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-23 10:29 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表