Python学习笔记(2)
20、在Python类定义的方法通常有三种:实例方法、类方法以及静态方法。
a、 这三者之间的区别是实例方法一般都以self作为第一个参数,必须和具体的对象实例进行绑定才能访问,而类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod,那么通过cls引用的必定是类对象的属性和方法;
b、而静态方法不需要默认的任何参数,跟一般普通函数类似,定义的时候使用@staticmethod,静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过对象来引用。
c、而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
21、创建实例对象
要创建一个类的实例,可以使用类的名称,并通过\_\_init\_\_方法接受参数。
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第一个对象"
emp2 = Employee("Manni", 5000)
22、访问属性
使用点(.)来访问对象的属性。使用如下类的名称访问类变量:
emp1.displayEmployee()
可以添加、删除、修改类的属性,如下所示:
emp1.age = 7 \#添加一个’age'属性
emp1.age = 8 \#修改 ’age'属性
del emp1.ag \#添加一个’age'属性
getattr(obj, name, default) :访问对象的属性。
hasattr(obj, name):检查是否存在一个属性。
setattr(obj, name, vlaue):设置一个属性,如果属性不存在,会创建一个新属性。
delattr(obj, name):删除属性。
23、Python内置类属性
\_\_dict\_\_:类的属性(包含一个字典,由类的数据属性组成)
\_\_doc\_\_:类的文档字符串
\_\_name\_\_:类名
\_\_module\_\_:类定义所在的模块(类的全名是'\_\_main\_\_.className',如果类位于一个导入模块mymod中,那么className.\_\_module\_\_等于mymod)
\_\_bases\_\_:类的所有父类构成元素(包含了以下个由所有父类组成的元组)
24、Python对象销毁(垃圾回收)
a、在Python内部记录着所有使用中的对象各有多少引用;
一个内部跟踪变量,称为一个引用计数器。
b、当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,这个对象的引用计数变为0时,它被垃圾回收,但是回收不是“立即”的,由解释器在适当的时机,将垃圾对象占用的内存空间回收。
25、类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
继承语法:
class 派生类名(基类名)://...基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在Python中继承中的一些特点:
1)、在继承中基类的构造(\_\_init\_\_()方法)不会被自动调用,它需要在其派生类的构造函数中亲自专门调用;
2)、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量,区别在于基类中调用普通函数时并不需要带上self参数;
3)、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找,如果在继承元组中列了一个以上的类,那么它就被称作“多重继承”
26、调用子类方法
序号 方法 描述 简单调用
1 \_\_init\_\_(self, \[, args ... \]) 构造函数 obj=class(args)
2 \_\_del\_\_(self) 析构函数,删除一个对象 dell obj
3 \_\_repr\_\_(self) 转化为供解释器读取的形式 repr(obj)
4 \_\_str\_\_(self) 用于将值转化为适于人阅读的形式 str(obj)
5 \_\_cmp\_\_(self, x) 对象比较 cmp(obj, x)
27、运算符重载
class Vector:
def \_\_init\_\_(self, a, b):
self.a = a
self.b = b
def \_\_str\_\_(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def \_\_add\_\_(self, other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2, 10)
v2 = Vector(5, -2)
print v1+v2 输出:Vector(7, 8)
28、类的私有属性
\_\_private\_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.\_\_private\_attr类的方法
在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
29、类的私有方法
\_\_private\_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用self.\_\_private\_method
30、模块
模块让你能够有逻辑的组织python代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂。模块也是python对象,具有随机的名字属性用来绑定或引用。简单的说,模块就是一个保存了python代码的文件,模块能定义函数、类和变量,模块里也能包含可执行的代码。
31、import语句
想使用python源文件,只需要在另一个源文件里执行import语句,可以自动防止重复import,形如:import module1, module2 ...
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
32、from … import语句
python的from语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:form module import name1\[, name2\[, ... nameN\]\]
例如:需要导入fib的fibonacci函数,使用如下语句:form fib import fibonacci (这个声明不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入到执行这个声明的模块的全局符号表)
33、form … import*语句
把一个模块的所有内容全部导入到当前的命名空间也是可行的,只需要使用如下声明:form modname import \* (这种声明不该被过多的使用)。
34、定位模块
当导入一个模块,python解析器对模块位置的搜索顺序是:当前目录;如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录;如果都找不到,python会观看默认路径,Linux下默认路径一般为/usr/local/lib/python;模块搜索路径存储在system模块的sys.path变量中,变量里包含当前目录,PYTHONPATH和由安装过程决定默认目录。
35、PYTHONPATH变量
作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。PYTHONPATH的语法和shell变量PATH的一样。
36、命名空间和作用域
a、变量是拥有匹配对象的名字(标识符),命名空间是一个包含了变量名称(键)和它们各自相应的对象(值)的字典。一个python表达式可以访问局部命名空间和全局命名空间里的变量,同名隐藏的原则同C/C++。
b、每个函数都有自己命名空间,类的方法的作用域规则和通常函数一样,默认任何在函数内赋值的变量都是局部的。因此,如果要给全局变量在一个函数里赋值,必须使用global语句。
c、global varName的表达式会告诉python,varName是一个全局变量,这样python就不会再局部命名空间里寻找这个变量了。
37、dir()函数
dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字,返回的列表容纳了在一个模块里定义的所有模块,变量和函数。
import math
content = dir(math)
print (content)
输出如下:
\['\_\_doc\_\_', '\_\_loader\_\_', '\_\_name\_\_', '\_\_package\_\_', '\_\_spec\_\_', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh','degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fm
od’, ‘frexp’, ‘fsum’, ‘gamma’, ‘gcd’, ‘hypot’, ‘inf’, ‘isclose’, ‘isfinite’, ‘isinf’, ‘isnan’, ‘ldexp’, ‘lgamma’, ‘log’, ‘log10’, ‘log1p’, ‘log2’, ‘modf’, ‘nan’, ‘pi’, ‘pow’, ‘radians’, ‘sin’, ‘sinh’, ‘sqrt’, ‘tan’, ‘tanh’, ‘trunc’]
38、globals()和locals()函数
根据调用地方不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字;如果在函数内部调用locals(),返回的是所有能在函数里访问的命名;如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字;两个函数的返回类型都是字典,所以名字能用keys()函数摘取。
39、python中的包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的python的应用环境,考虑一个Phone目录下的pots.py文件。这个文件有如下源代码:
\#pots.py
\#coding=utf-8
\#!/usr/bin/python
def Pots()
print "I'm Pots Phone"
同样的,我们有另外两个保存了不同函数的文件:
Phone/Isdn.py 含有函数Isdn()
Phone/G3.py()
现在,在phone目录下创建file init.py
Phone/\_\_init\_\_.py
此文件可为空
from Phone.pots import post
或者当你导入phone时,为了能够使用所有函数,你需要在\_\_init\_\_.py里使用显式的导入语句:如下:
from Pots import Pots
from Isdn import Isdn
from G3 import G3
当你把这些代码添加到init.py之后,导入phone包的时候这些类就全都是可用的了。
\#Now import your Phone Package
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
以上实例输出结果:
I'm Pots Phone
I'm 3G Phone
I'm Isdn Phone
40、模块发布
1)、mymodule目录结构体如下:
|—setup.py
|—suba
| |—aa.py
| |—bb.py
| |—\_\_init\_\_.py
|
|—subb
|—cc.py
|—dd.py
|—\_\_init\_\_.py
2)、编写setup.py,py\_modules需要指明所需要包含的py文件
from distuils.core import setup
set(name="xwp", version="1.0", description="xwp's module", author="hanbo", py\_modules=\['suba.aa', 'suba.bb', 'subb.cc', 'subb.dd'\])
3)、构建模块
python setup.py build
构建后目录结构
|—build
| |—lib.linux-i686-2.7
| |—suba
| | |—aa.py
| | |—bb.py
| | |—\_\_init\_\_.py
| |
| |—subb
| |—cc.py
| |—dd.py
| |—\_\_init\_\_.py
|
|—setup.py
|
|—suba
| |—aa.py
| |—bb.py
| |—\_\_init\_\_.py
|
|—subb
|—cc.py
|—dd.py
|—\_\_init\_\_.py
4)、生产发布压缩包
python setup.py sdist
打包后,生成最终发布压缩包xwp-1.0.tar.gz,目录结构
|—build
| |—lib.linux-i686-2.7
| |—suba
| | |—aa.py
| | |—bb.py
| | |—\_\_init\_\_.py
| |
| |—subb
| |—cc.py
| |—dd.py
| |—\_\_init\_\_.py
|
|—dist
| |—xwp-1.0.tar.gz
|
|—MANIFEST
|
|—setup.py
|
|—suba
| |—aa.py
| |—bb.py
| |—\_\_init\_\_.py
|
|—subb
|—cc.py
|—dd.py
|—\_\_init\_\_.py
41、文件操作
1)、打印到屏幕
最简单的输出方法是用print语句,可以给它传递零个或多个用逗号隔开的表达式,或者占位符
2)、读取键盘输入
python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘,如下:
raw\_input():从标准输入读取一行,并返回一个字符串(去掉结尾的换行符)
input():和raw\_input()基本可以互换,但是它会假设你的输入是一个有效的python表达式,并返回运算结果。
3)、打开文件
open():打开一个文件,创建一个file对象。
file\_object=open(file\_name \[, access\_mode\]\[, buffering\])
参数如下:
file\_name:是一个包含了要访问的文件名称的字符串;
access\_mode:决定了打开文件的模式(只读、写入、追加等);
buffering:缓冲区的大小(为0:就是不会有寄存;为1:访问文件时会寄存行;大于1:寄存区的缓冲大小。如果取负值,寄存区的缓冲区大小则为系统默认)
4)、file对象属性
一个文件被打开后,有一个file对象,可以得到有关该文件的各种信息。
属性 描述
file.closed 返回true如果文件已被关闭,否则返回false
file.mode 返回被打开文件的访问权限
file.name 返回文件的名称
file.softspace 如果用print输出后,必须跟一个空格符,则返回false,否则返回true
5)、文件关闭
close():刷新缓冲区里任何还没有写入的信息,并关闭该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,python会关闭之前的文件,用close()方法关闭文件是一个很好的习惯。
6)、write():将任何字符产写入一个打开的文件。python字符串可以是二进制数据,而不是仅仅是文字。write方法不再字符串的结尾添加换行符'\\n'。
7)、read():从一个打开的文件中读取一个字符串,python字符串可以是二进制,而不仅仅是文字。
8)、文件位置
seek():告诉你文件内的当前位置,就是下次读写会发生在文件开头多少字节之后。
seek(offset \[, from\])改变当前文件的位置,offset变量表示要移动的字节数。from变量指定开始移动字节的参考位置,如果from被设为0,这意味着将文件的开头作为移动字节的参考位置,如果设为1,则使用当前的位置作为参考位置,如果它被设为2,那么该文件的末尾将作为参考位置。
9)、重命名
rename():需要两个参数,当前文件名和新文件名。(使用需要导入os模块)
10)、删除文件
remove():需要提供要删除的文件名作为参数。(使用需要导入os模块)
还没有评论,来说两句吧...