可爱的Python编程

上传人:钟*** 文档编号:1615084 上传时间:2019-10-30 格式:PPT 页数:86 大小:2.51MB
返回 下载 相关 举报
可爱的Python编程_第1页
第1页 / 共86页
可爱的Python编程_第2页
第2页 / 共86页
可爱的Python编程_第3页
第3页 / 共86页
点击查看更多>>
资源描述
可爱的Python,1,Python技术前景 开始使用Python Python中的数据类型 Python中的变量 Python中的控制语句 Python中的函数 Python中的类,Python对象的序列化 Python中的正则表达式 Python多线程编程 Python中的socket编程 Python设计模式 更可爱的yield,CONTENT,目 录,2,什么是Python Python技术优势 Python的应用,CONTENT,1,Python技术前景,3,Python 是一种功能强大的解释性,交互性,面向对象(OO)的第四代计算机编程语言。 她集成了模块、包、例外机制、动态造型以及非常高级的动态数据类型。它的语法表达优美易读。 它具有很多优秀的脚本语言的特点:解释的,面向对象的,内建的高级数据结构,支持模块和包,支持多种平台,可扩展。 而且它还支持交互式方式运行,图形方式运行。它的语法有很多与众不同的特性。 它具有动态语义和快速的原型开发能力,也许在短短的几分钟内,你就可以开发出使用其它语言可能需要花费几个小时的原型系统。Python丰富的工具集使得它位于传统脚本语言(如Tcl、Perl和Scheme)和系统编程语言(如C、C+和Java)之间,既具备了脚本语言的简单易用性,同时又能够提供只有系统语言才可能拥有的某些高级特性。,什么是Python,4,Python技术优势,容易学习,Python提供了一个交互式环境,这是他容易学习的主要原因之一,正如一个资深程序员所说,软件的复杂是因为千万件事堆在一起,交互式环境恰好可以让我门把程序分解开,我们可以试验每个不清楚的语言成分,同时这也是一个很好的测试平台。 其次,Python程序很容易阅读。这得益于他的语法简洁,用缩排格式代替了,程序短小精悍(比其它语言,例如Java的代码短2/3到3/4),同时语言直截了当,接近自然语言,很少有专门定义的特殊符号,这也是Python容易学习的原因之一。,5,Python技术优势,火力强大,容易学习并不代表功能简单,从桌面程序,到网络互联,图形处理,科学计算,实时控制,到处都有Python的身影,Python是编译执行的,跨平台的(Windows,Unix, Macantoshi),面向对象的。Java可以完成的功能,Python都可以替代之。 此外,支持类和多继承的面向对象程序设计,代码可以被打包为模块和包。支持异常处理追踪并能够列出比较清晰,详细的错误提示。包含了一些高级的程序设计特性,例如代码生成器和解释器,自动垃圾收集功能使你从内存管理的争战中解脱出来。 庞大的标准库支持很多一般的程序设计任务,如网络服务器连接,正则表达式,文件操作,编译器很容易扩展,可以将C/C+编译后的摸板作为新的摸板加入到其中。,6,Python技术优势,快速开发,Python内建的高层次数据结构,以及动态类型和动态邦定,使得它非常适合于快速应用开发,也适合于连接已有的部件。Python的简单易于阅读的语法强调了可读性,因此降低了程序的维护费用,Python支持模块和包,并鼓励程序模块化和代码重用。,高效运行,Python可以编译执行,其运行效率接近C语言的运行速度,相同功能的代码运行速度约为 C的90%,而同时Java的运行速度却只能达到C的50%。,Python的流行程度,Python对国内的用户也许比较陌生,但在国外早已得到成熟、广泛的应用。著名的搜索引擎google,其核心代码就是用Python完成的,迪斯尼公司的动画生成,许多unix的版本(包括Linux)都内建了Python环境支持。就连google本身也是由Python技术建立的。,7,Python的应用,在许多领域都有Python的用武之地。包括桌面应用、科学计算、图形技术、动画、游戏、WEB应用、嵌入式系统等等,目前成功一些成功应用有:,Google核心搜索引擎 美国宇航局使用Python实现CAD/CAE/PDM 库及模型管理系统 全球知名的光影技术先驱Industrial Light & Magic 使用Python 处理电影光影合成 全球最大的游戏厂商EVE-online利用Python使同时服务10.000个玩家在同一个程序的内存空间成为可能 Yahoo 使用Python建立起全球范围的站点群 迪斯尼乐园DISNEY 使用Python动画的生产 ,8,Python的安装 Python的运行 Py2exe的打包,CONTENT,2,开始使用Python,9,Python的安装,安装ActivePython 包含了Python所有自带的内库,及其相应的帮助,安装完成后所有的环境变量自动设置好,可以直接启动。,安装py2exe 一个比较好用的Python程序打包工具,可以将你写的程序打成包,不至于一个个的PYC文件。,安装wxPython 界面开发的一个不错的选择,是wxWidgets 用Python封装而来的。,Python的安装极为简单快截,所有你需要建议安装ActivePython,再安装打包工具py2exe,最后如果要开发界面可以选择安装WxPython。,10,Python的运行,在以上的互动模式下可以直接输入Python代码进行互动运行。 strTest = hello ! print strTest hello ! ret = 1+1 ret 2 ,安装之后通过开始运行python,或者开始运行cmd,再输入python回车都可以进入python的互动模式。,11,Py2exe的打包,文件 setup.py 的内容: from distutils.core import setup import py2exe setup( # The first three parameters are not required, if at least a # version is given, then a versioninfo resource is built from # them and added to the executables. version = “0.5.0“, description = “py2exe sample script“, name = “py2exe samples“, # targets to build windows = “test.py“, #console = “Uninstall.py“,“Install.py“, ),文件 test.py 的内容: from Tkinter import * root = Tk() def callback(event): print “clicked at“, event.x, event.y frame = Frame(root, width=100, height=100) frame.bind(“, callback) frame.pack() root.mainloop(),在命令行下输入setup.py py2exe即可完成打包过程: E:pythontestTKintersetup.py py2exe,12,数字类型 字符类型 列表类型 字典类型,CONTENT,3,Python的数据类型,13,数字类型,Python的数字几乎没有什么限制,类型也不是很确定,不像C/C+中int、long等都有大小限制。 a = 123456789987654321123456789987654321123456789987654321123456789987654321 a 123456789987654321123456789987654321123456789987654321123456789987654321L a + 1 123456789987654321123456789987654321123456789987654321123456789987654322L,14,数字类型,一般的运算符号 +, -, * 以及 / 的用法就跟其它的程序语言(像是Pascal或C)一样。你也可以用括号 “( )“ 来表示运算执行的先后次序: 2+2 4 (50-5*6)/4 5 7/-3 -3,浮点数的运算在Python里面也是支持的: 4 * 2.5 / 3.3 3.0303030303,复数的运算也支持的,只需要把虚数部分加上 “j” 或是 “ J”在其后就可以了: 1j * 1J (-1+0j) 1j * complex(0,1) (-1+0j) a=1.5+0.5j a.real 1.5 a.imag 0.5,15,字符类型,字符串的表示,字符串在Python中有很多种表达方式,它可以放在双括号”之中,也可以放在单括号里面,还可以放在” ”中 :, spam eggs spam eggs doesnt “doesnt“ “Yes,“ he said.“ “Yes,“ he said. “test“ test print “line1 . line2“ line1 line2,16,字符类型,字符串的运算,字符串可以用 + 这个操作数来相加 (连接起来),或是用 * 这个操作数来重复之: Help + A HelpA ,字符串对象自带了很多的方法用于运算: dir() _add_, _class_, _contains_, _delattr_, _doc_, _eq_, _ ge_, _getattribute_, _getitem_, _getnewargs_, _getslice_, _g t_, _hash_, _init_, _le_, _len_, _lt_, _mod_, _mul_ , _ne_, _new_, _reduce_, _reduce_ex_, _repr_, _rmod_, _rmul_, _setattr_, _str_, capitalize, center, count, decode, encode, endswith, expandtabs, find, index, isalnum, isalpha, isdi git, islower, isspace, istitle, isupper, join, ljust, lower, lst rip, replace, rfind, rindex, rjust, rstrip, split, splitlines, s tartswith, strip, swapcase, title, translate, upper, zfill,17,字符类型,字符串的切片, word = HelpA word4 A word2:4 lp word-1: A wodr-5 H,如同在C语言一样,字符串是有标记(subscript(index)的,第一个字符的标记(subscript(index)就是0。在Python中没有另外一个字符character数据型态,一个字符就是一个长度为 1的字符串,与C不同的是,Python的字符串是不可改变的(immutable)。,最好避免错误的方法是把index看成是指向字符及字符间位置的指针,字符串的最开头是0,字符串的结尾处就是字符串的长度。如下图所示: +-+-+-+-+-+ | H | e | l | p | A | +-+-+-+-+-+ 0 1 2 3 4 5 -5 -4 -3 -2 -1,18,列表类型,Python能够了解一些较为 复杂 的数据型态,这些数据型态大多是用来处理一群的其它数据值。最方便使用的要算是 list 了,一个list可以写成一串由逗号分开的值(东西),然后用角括号括起来便成。放在list里的东西不需要是同一个数据型态。跟字符串的index用法相同,list的index也由0开始,同样你可以用index来切割lists、组合两个list等等:, a spam, eggs, 100, 1234 a2 = a2 + 23 a spam, eggs, 123, 1234, a0:2 = 1, 12 a 1, 12, 123, 1234 a * 2 1, 12, 123, 1234, 1, 12, 123, 1234,19,列表类型,Python中列表的用处远远不只前面讲的,它和字符串一样有专门的一套方法集用于其操作,具体就不列举了,可以通过帮助查询。下面再介绍几个很有用的用法:List的堆栈使用、队列使用、功能式程序设计工具。,List的堆栈使用: stack = stack.append(1) stack.append(2) stack.append(3) stack.pop() 3 stack 1, 2 stack.pop() 2 stack 1 stack.pop() 1 stack ,List的队列使用: queue = queue.append(1) queue.append(2) queue.append(3) queue.pop(0) 1 queue 2, 3 queue.pop(0) 2 queue 3 queue.pop(0) 3 queue ,20,列表类型,功能式程序设计工具:有三个与list合用非常有用的内建工具函式: filter(), map(), 以及 reduce() 。,“filter( function, sequence)“ 这个函式会传回 一个sequence (如果可能的话其成员为同一数据型态),这个sequence里面的成员都是将 sequence 里面的的成员,一一传入到 function( item) 所代表的函式后,传回值为true的成员所组合而成。这个函式对于传入的 sequence 有过滤的效果,如下例所示: def f(x): . return x5 . filter(f, 1,2,7,9) 7, 9,“map( function, sequence)“ 会针对 sequence 里的各个成员呼叫 function(item) ,然后传回个别成员呼叫之后传回的结果。举例来说,要计算一连串的立方值,我们可以如此做: def cube(x): return x*x*x . map(cube, range(1, 11) 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000,“reduce( func, sequence)“ 会利用 sequence 的前两个成员当参数呼叫 func ,然后所得的传回值再与下一个成员当参数传入 func ,一直到整个 sequence 结束。下面的例子计算1到10的总和: def add(x,y): return x+y . reduce(add, range(1, 11) 55 def sum(seq): . def add(x,y): return x+y . return reduce(add, seq, 0) . sum(range(1, 11) 55 sum() 0,21,字典类型,另外一个在Python当中很好用的内建数据型态是字典( dictionary )。Dictionary有的时候在别的程序语言里面也叫做连结记忆( associative memories )或者是连结数组( associative arrays )。不同于sequence是由一连串的数字来做index,dictionary用一个特殊的不可改变的(immutable)钥( keys 来当作其 index。字符串及数字都不能被改变,所以都可以来当作dictionary的key。在dictionary里面key的值必须是唯一不重复的 ,我们最好把dictionary想象成一个没有顺序的 key: value 成对的组合 。它所有支持的方法,你可以通过dir()查找到。, tel = jack: 4098, sape: 4139 telguido = 4127 tel sape: 4139, guido: 4127, jack: 4098 teljack 4098 del telsape, telirv = 4127 tel guido: 4127, irv: 4127, jack: 4098 tel.keys() guido, irv, jack tel.has_key(guido) 1,22,变量的分类 变量的赋值 全局变量与局部变量 特殊变量 文件间的变量处理,CONTENT,4,Python中的变量,23,变量的分类,Python中变量分普通变量和特殊变量:,普通变量:保存数值、字串、元组、列表、字典、文件句柄,特殊变量:模块、函数、类。,24,变量的赋值,对变量的赋值过程: 先建一个变量的实例,然后把实例的址址值给变量。变量实际上都是特别的指针,受限指针。只能取与赋值的指针,不能参与指针运算。,例如下以代码: a=abc # a=a,b,c # 运行完第一句后,a就指向abc , 运行完第二句后,a就指向a,b,c 。,25,变量的赋值,分析以下代码: a = b = c = a,b,c # b1 = w c2 = k # c = 12345678 # 运行到,是,对应的内存分别如左图,可以在每一句语句后打输出a,b,c 的各值。,变量赋值举例,26,全局变量和局部变量,单个文件中的全局变量与局部变量,以下代码中,fun 函数中可以用全局变量,在fun函数中g_a是只读的,g_a = 123 def fun(): g_a = 4 print g_a fun() print g_a,g_a = 123 def fun2(): k = g_a print g_a, k g_a = 4 fun2() print g_a,以下代码呢?Fun2函数据中的g_a是全局还是局部变量呢?,= Result= 4 123,运行出错。g_a 是局部变量,不要忘了Python运行代码时是先编译的。g_a 有赋值,就成了局部变量。如果加 global 则显式指示为全局变量,27,特殊变量,模块变量: import a b = a c=b.ClassC #ClassC 是一个类,类变量: class ClassD: def _init_(self): pass def Hello(self, name): print Hello %s % name b = ClassD a = b() a.Hello(“whj“),函数变量: def Hello(name): print Hello %s % name a = Hello a(whj),特殊变量的赋值也同上述所讲的变量赋值一样处理。,28,文件间的变量处理,文件 inc.py 的内容: g_str = “org“; g_list = “orgA“, “orgB“, “orgC“; print g_str; print g_list; def print_org(): print =begin print_org; print g_str; print g_list; print -end print_org;,文件 main.py 的内容: from inc import * def print_main(): print +begin print_main print g_str; print g_list; print -end print_main print_org(); print_main() g_str=“main“; g_list0=“main“; print_org();print_main(); g_list=“ddd“ print_org();print_main(),运行: E:pythonpython main.py 结果: org orgA, orgB, orgC =begin print_org org orgA, orgB, orgC -end print_org +begin print_main org orgA, orgB, orgC -end print_main =begin print_org org main, orgB, orgC -end print_org +begin print_main main main, orgB, orgC -end print_main =begin print_org org main, orgB, orgC -end print_org +begin print_main main ddd -end print_main,29,文件间的变量处理,30,if 叙述 for 叙述 break 及 continue 叙述 pass 叙述 while 叙述 tryexcept叙述 特殊的yield,CONTENT,5,Python中的控制语句,31,if 叙述,大概最为人所知的 statement 就是 if 叙述了,举例如下: x = int(raw_input(“Please enter a number: “) if x 0: . x = 0 . print Negative changed to zero . elif x = 0: . print Zero . elif x = 1: . print Single . else: . print More. elif 的部份可以没有也可以有很多个, else 部分可以有一个也可以没有。 elif 这个关键词是else if的简化,而且有减少过分缩排的效果。 用 if . elif . elif . 这样的写法可以来取代在其它一些程序语言中常见的 switch 或是 case 的写法。,32,for 叙述,在Python里的 for 叙述的用法与在C或是Pascal里的用法有所不同。不像是在Pascal中一定要执行某个数目的循环,也不像是在C中让使用者决定执行的进度(step)及结束执行的条件,Python的 for 叙述会将一个系列(sequence,像是list或是string)里所有的成员走遍一次,执行的顺序是依照成员在squence里的顺序。以下是一个例子: # Measure some strings: . a = cat, window, defenestrate for x in a: . print x, len(x) . cat 3 window 6 defenestrate 12,在循环的执行之中改变sequence的内容是危险的一件事(当然,只有可变的sequence像list才能作更动),如果你真的需要在循环的执行中改变list的成员值,最好先复制一份这个list的拷贝,然后针对这个拷贝来做循环。list的切割(slice)提供了一个简便的制作拷贝的方法: for x in a: # make a slice copy of the entire list . if len(x) 6: a.insert(0, x). a defenestrate, cat, window, defenestrate,33,break 及 continue 叙述, for n in range(2, 10): . for x in range(2, n): . if n % x = 0: . print n, equals, x, *, n/x . break . else: . print n, is a prime number .,如同在C语言里一样, break 叙述中断最靠近的一个 for 或 while 循环。 同样的,从C语言借过来的 continue 叙述会中断目前执行的循环,并且执行下一个循环。 特别的是,Python的循环有一个 else 子句,这个子句之后的程序代码会在整个循环正常结束的时候执行,(对 for) 循环而言指的是list已经到底,对 while 循环而言指的是条件式变成false)。但是,若是在非正常结束(因为 break 叙述)的情况下 else 子句的程序代码就不会执行。底下的例子是一个循环,用来找出所有的质数:,2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3,34,pass 叙述,pass 叙述什么也不做,通常是用在当你的程序的语法上需要有一个叙述,但是却不需要做任何事的时候。例子如下: while 1: . pass # Busy-wait for keyboard interrupt . 程序在设计阶段,把一些类、函数、接口等都定义好,但是还没有实现的情况下,一般用pass表示,如下: class CBaseOpt: . pass . def fun(): . pass,35,while 叙述,在这个程序中,首先,我们检验变量running是否为True,然后执行后面的 while-块 。在执行了这块程序之后,再次检验条件,在这个例子中,条件是running变量。如果它是真的,我们再次执行while-块,否则,我们继续执行可选的else-块,并接着执行下一个语句。 当while循环条件变为False的时候,else块才被执行这甚至也可能是在条件第一次被检验的时候。如果while循环有一个else从句,它将始终被执行,除非你的while循环将永远循环下去不会结束!,number = 23 running = True while running: guess = int(raw_input(Enter an integer : ) if guess = number: print Congratulations, you guessed it. running = False # this causes the while loop to stop elif guess number: print No, it is a little higher than that else: print No, it is a little lower than that else: print The while loop is over. # Do anything else you want to do here print Done,else块事实上是多余的,因为你可以把其中的语句放在同一块(与while相同)中,跟在while语句之后,这样可以取得相同的效果。,36,tryexcept 叙述, try: . open(myfile.txt).read() . except IOError, (errno, strerror): . print “I/O error(%s): %s“ % (errno, strerror) . except ValueError: . print “Could not convert data to an integer.“ . except: . print “Unexpected error:“, sys.exc_info()0 . raise . else: . print no except! . I/O error(2): No such file or directory,try . except 的叙述有一个可有可无的else子句( else clause )可以使用,当这个子句存在时,必须是放在所有的except clauses的后面。这个子句里的叙述是当try子句没有发生任何exception时,一定要执行的叙述,except可以嵌套,不过一般是外面的比里面的要大,比如except:就包含了所有的异常。,37,tryexcept 叙述, try: . open(myfile.txt).read() . finally: . print finally! . 发生异常后,也会保证finally里的语句会执行。 运行结果: finally! Traceback (most recent call last): File “, line 2, in ? IOError: Errno 2 No such file or directory: myfile.txt,38,特殊的yield,后续会详细介绍,这是个好东东,也是Python的一大特性。,39,函数的定义 函数的参数 函数的自省 函数的作用域 嵌套函数,CONTENT,6,Python中的函数,40,函数的定义,函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为 调用 函数。我们已经使用了许多内建的函数,比如len和range。 函数通过def关键字定义。def关键字后跟一个函数的 标识符 名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。如下简单函数:,def sayHello(): print Hello World! # block belonging to the function sayHello() # call the function,41,函数的参数,函数形参 形参是函数的参数名称。如a、b,函数实参 提供给函数调用的值为实参。如3、4、x、y;在第一个printMax使用中,我们直接把数,即实参,提供给函数。在第二个使用中,我们使用变量调用函数。printMax(x, y)使实参x的值赋给形参a,实参y的值赋给形参b。,def printMax(a, b): if a b: print a, is maximum else: print b, is maximum printMax(3, 4) x = 5 y = 7 printMax(x, y),def func(a, b=5, c=10): print a is, a, and b is, b, and c is, c func(3, 7) func(25, c=24) func(c=50, a=100),在第一次使用函数的时候, func(3, 7),参数a得到值3,参数b得到值7,而参数c使用默认值10。 在第二次使用函数func(25, c=24)的时候,根据实参的位置变量a得到值25。根据命名,即关键参数,参数c得到值24。变量b根据默认值,为5。 在第三次使用func(c=50, a=100)的时候,我们使用关键参数来完全指定参数值。注意,尽管函数定义中,a在c之前定义,我们仍然可以在a之前指定参数c的值。,名为func的函数有一个没有默认值的参数,和两个有默认值的参数。,42,函数的参数,如果用过C语言中的printf(),那么就会对参数个数可变的意义比较了解。在Python中*表示接受任意多个参数,除了前面的参数后,多余的参数都作为一个tuple传递给函数printf,可以通过arg来访问。, def printf(format,*arg): . print format%arg . printf (“%d is greater than %d“,1,2) 1 is greater than 2, def printf(format,*keyword): . for k in keyword.keys(): . print “keyword%s is %s“%(k,keywordk) . printf(“ok“,One=1,Two=2,Three=3) keywordThree is 3 keywordTwo is 2 keywordOne is 1,还可以把这两中机制和可选参数机制合在一起使用。 函数接受参数的顺序,先接受固定参数,然后是可选参数,然后是接受任意参数,最后是带名字的任意参数。,还有种形式可以实现任意多个参数,就是按照dictionary方式传递给函数。 同上一种机制,只不过*keyword是用*表示接受任意多个有名字的参数传递,调用时要指定参数的名字,如One、Two、Three等。, def testfun(fixed,optional=1,*arg,*keywords): . print “fixed parameters is “,fixed . print “optional parameter is “,optional . print “Arbitrary parameter is “, arg . print “keywords parameter is “,keywords . testfun(1,2,“a“,“b“,“c“,one=1,two=2,three=3) fixed parameters is 1 optional parameter is 2 Arbitrary parameter is (a, b, c) keywords parameter is three: 3, two: 2, one: 1,43,函数的自省,def printMax(x, y): Prints the maximum of two numbers. The two values must be integers. x = int(x) # convert to integers, if possible y = int(y) if x y: print x, is maximum else: print y, is maximum printMax(3, 5) print printMax._doc_,5 is maximum Prints the maximum of two numbers. The two values must be integers.,运行后的输出:,在函数的第一个逻辑行的字符串是这个函数的 文档字符串 。注意,自省也适用于模块和类。 文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。 可以使用_doc_(注意双下划线)调用printMax函数的文档字符串属性。请记住Python把 每一样东西 都作为对象,包括这个函数。 自动化工具也可以从程序中提取文档。因此,强烈建议所写的任何正式函数编写文档字符串。随着Python发行版附带的pydoc命令,与help()类似地使用DocStrings。,44,函数的作用域,Python按照LGB规则找变量,先找local name space(局部命名空间),再找global name space(全局命名空间),然后再找buildin name space(内在命名空间)用global语句可以改变某些变量的命名空间。, a=1 def testfun(): . a=2 . print a . testfun() 2 a 1, a=1 def testfun(): . global a . a=2 . print a . testfun testfun() 2 a 2,函数testfun()中的a是local name space中,修改a不会改变global name space中的a但是,用global语句可以修改一个变量的所在的name space。,45,嵌套函数, def outfun(a,b): . def innerfun(x,y): . return x+y . return innerfun(a,b) . outfun(1,2) 3,这个在C语言是不容许的,因为C中的static函数可以替代这种功能。这种机制提供了一个函数范围的概念,某些函数只在某些函数的内部,才看得到,如果要公开,可以通过返回值,将内部函数返回。注意,嵌套函数不能访问外层函数的变量。,46,类定义 类/类实例属性 类继承 类中的一些特殊方法 重载特殊方法用法举例,CONTENT,7,Python中的类,47,类的定义,class Person: # def _init_(self, name): # self.name = name # def sayHi(self): # print Hello, my name is, self.name p = Person(Swaroop) p.sayHi(),类的方法与普通的函数只有一个特别的区别它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。Python中的self等价于C+中的self指针和Java、C#中的this参考。 为何不需要给self赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)这就是self的原理了。 这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。, 我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。 _init_方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化 。 self.name是成员变量。 sayHi是成员方法。,48,类/类实例属性,对象的变量 由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。通过一个例子会使这个易于理解。,Python分类的变量和对象的变量,它们根据是类还是对象 拥有这个变量而区分。,类的变量 由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。Python利用这个实现了C+中的静态成员变量,就是同一个class的不同instance共享同一个变量。,49,类/类实例属性,运行结果:,class Person: population = 0 def _init_(self, name): self.name = name print (Initializing %s) % self.name Person.population += 1 def _del_(self): print %s says bye. % self.name Person.population -= 1 if Person.population = 0: print I am the last one. else: print There are still %d people left. % Person.population def sayHi(self): print Hi, my name is %s. % self.name def howMany(self): if Person.population = 1: print I am the only person here. else: print We have %d persons here. % Person.population,swaroop = Person(Swaroop) swaroop.sayHi() swaroop.howMany() kalam = Person(Abdul Kalam) kalam.sayHi() kalam.howMany() swaroop.sayHi() swaroop.howMany(),(Initializing Swaroop) Hi, my name is Swaroop. I am the only person here. (Initializing Abdul Kalam) Hi, my name is Abdul Kalam. We have 2 persons here. Hi, my name is Swaroop. We have 2 persons here. Abdul Kalam says bye. There are still 1 people left. Swaroop says bye. I am the last one.,50,类继承,对于继承和C+一样,只是比C+中的继承更简单,没有了一堆什么私有公有继承。,class SchoolMember: def _init_(self, name, age): self.name = name self.age = age print (Initialized SchoolMember: %s) % self.name def tell(self): print Name:“%s“ Age:“%s“ % (self.name, self.age), class Teacher(SchoolMember): def _init_(self, name, age, salary): SchoolMember._init_(self, name, age) self.salary = salary print (Initialized Teacher: %s) % self.name def tell(self): SchoolMember.tell(self) print Salary: “%d“ % self.salary class Student(SchoolMember): def _init_(self, name, age, marks): SchoolMember._init_(self, name, age) self.marks = marks print (Initialized Student: %s) % self.name def tell(self): SchoolMember.tell(self) print Marks: “%d“ % self.marks,t = Teacher(Mrs. Shrividya, 40, 30000) s = Student(Swaroop, 22, 75) print # prints a blank line members = t, s for member in members: member.tell(),(Initialized SchoolMember: Mrs. Shrividya) (Initialized Teacher: Mrs. Shrividya) (Initialized SchoolMember: Swaroop) (Initialized Student: Swaroop) Name:“Mrs. Shrividya“ Age:“40“ Salary: “30000“ Name:“Swaroop“ Age:“22“ Marks: “75“,运行结果:,Python和JAVA一样也支持多重继承,这里不介绍了。,51,类中的一些特殊方法,Class 中有很多的特殊方法,像前面讲的_init_就是其中一个,下面我们再列举几个:,_init_ 前面已经介绍,就是在对象创建时被自动调用,用于初试化; _del_前面也介绍了,在对象删除时被自动调用,可以做些我们的收尾工作; _repr_使用repr(obj)时自动调用,返回和eval()兼容的对象字符串eval(repr(obj); _str_使用str(obj)时自动调用,返回对象的字符串描述; _cmp_比较操作符,0表示相等,1表示大于,-1表示小于; _hash_返回一个32位的hash value,一般将对象hash后用作dictionary的key; _nozero_定义对象是否是逻辑假,返回0表示逻辑假,返回1表示逻辑真; _len_使用len(obj)时自动调用,返回对象的长度; _getitem_返回selfkey用来模拟list、dictionary等数据结构; _setitem_设置selfkey,模拟selfkey = value; _delitem_模拟del selfkey,调用这个函数; _contain_可以使对象像队列一样,处理in语句; _call_使对象像函数一样,可以调用,如obj(arg)。,52,重载特殊方法用法举例,重载_setattr_实现只读属性:,class A: readonlyValue=100 def _setattr_(self,attr,value): if attr=“readonlyValue“: raise
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!