Chinaunix首页 | 论坛 | 博客
  • 博客访问: 584581
  • 博文数量: 213
  • 博客积分: 6789
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-01 17:11
文章分类

全部博文(213)

文章存档

2012年(9)

2011年(62)

2010年(99)

2009年(43)

分类: Python/Ruby

2009-12-02 14:26:59

使用from module import 导入模块
python有两种导入模块的方法。import module, from module import.
from module import基本语法
from UserDict import UserDict
他与import module很类似,但是有一个重要区别:UserDict被直接导入到局部名字空间去了,所以他可以直接使用,而不需要加入文件名的限制.
>>> import types
>>> types.FunctionType 1
    
>>> FunctionType       2
Traceback (innermost last):
File "", line 1, in ?
NameError: There is no variable named 'FunctionType'
>>> from types import FunctionType 3
>>> FunctionType 4
1 模块不包含方法,只表示每种python对象名字的属性.这个属性必须用模块名types进行限定.
2 FunctionType没有存在当前名字空间,只存在于type上下文中.
3 这个语法直接从type上下文中将FunctionType属性导入到局部名字空间中.
4 现在Function可以直接使用,于type无关.

类的定义
python是完全面向对象的,你可以定义自己的类,也可以从自己的或者内置的类继承,然后从你定义的类创建实例。
python以保留字class开始,后面跟着类名。

class Loaf:
  pass
类名第一个字母一般大写。pass相当于C中的{},在类中的所有东西都要缩进,第一条不缩进的不属于这个类。
from UserDict import UserDict
class Fileinfo(UserDict):
在python中,类的基类只是简单的列在类名后面的小括号里面。所以Fileinfo类是从UserDict中继承来的。
python支持多重继承,在类名后面的小括号中,你可以列出你想要的列名,以逗号隔开。
python必须调用父类中的合适方法。
__init__没有返回值。

class FileInfo(UserDict):
   "store file metadata"
   def __init__(self, filename=None): 
self指向新创建的对象,在其他的类方法中,它指向方法被调用的类实例。当定义方法时候你要明确指定self,但是调用时候不用指定。
__init__方法可以接受任意数目的参数,就像函数一样,参数可以用缺省值定义。

class FileInfo(UserDict):
   "store file metadata"
   def __init__(self, filename=None):
   UserDict.__init__(self)  1
   self["name"] = filename
1 一些伪面向对象语言,父类的方法在子类的方法执行之前被自动调用。python不是这样,你必须显示的调用在父类中的合适方法。

了解何时使用self和__init__
当定义自己的类方法时,你必须明确将self作为每个方法的第一个参数列出,包括__init__。当从你的类中调用父类时候,你必须包括self参数。当你从外部调用你的类时候,不用对self指定任何值。
在python中对类进行实例化华很直接。要对类进行实例化,只要调用类,传入定义在__init__方法中的参数。返回值将是新创建的对象。
__init__方法
__init__方法是可选的,一旦你定义了就必须记得显示调用父类的__init__方法。无论何时子类想扩展父类的行为,后代方法必须在适当时机,使用适当参数,显式调用父类方法。
类的实例化
>>> import fileinfo
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>> f.__class__
>>> f.__doc__
'store file metadata'
>>> f
{'name': '/music/_singles/kairo.mp3'}
你正在创建FileInfo的实例,并且将新创建的实例赋值给f,你传入了1个参数,他将作为最后在FileInfo中__init__方法中的filename参数。
每一个类的实例有一个内置属性,__class__,他是对象的类。

垃圾回收
如果说创建一个新的实例是容易的,那么销毁他甚至更容易。当指派给他们的变量超出作用区域时候,他们会自动的释放,内存泄露在python中很少见。

探索UserDict : 一个封装类

专用类方法:
__getitem__方法
__setitem__方法

高级专用类方法
__repr__返回一个对象的字符串表示,在交互式窗口中,当你只敲入变量名,然后按enter,他能显示变量值。
__cmp__在比较类实例时候被调用。用于比较。
__len__在调用len(instance)时被调用。len是一个内置函数,可以返回一个对象的长度。
__delitem__在调用del instance[key]时调用,你可能记得他作为从字典中删除的方法。

类属性介绍
class MP3FileInfo(FileInfo):
   "store ID3v1.0 MP3 tags"
   tagDataMap = {"title" : ( 3, 33, stripnulls),
   "artist" : ( 33, 63, stripnulls),
   "album" : ( 63, 93, stripnulls),
   "year" : ( 93, 97, stripnulls),
   "comment" : ( 97, 126, stripnulls),
   "genre" : (127, 128, ord)}
>>> import fileinfo
>>> fileinfo.MP3FileInfo
>>> fileinfo.MP3FileInfo.tagDataMap
{'title': (3, 33, ),
'genre': (127, 128, ),
'artist': (33, 63, ),
'year': (93, 97, ),
'comment': (97, 126, ),
'album': (63, 93, )}

私有函数
私有函数不可以从他们的模块外面被调用。
私有类方法不能够从他们的类外面被调用。
私有属性不能够从他们的类外面被访问。
如果一个python函数,类方法,或属性的名字以两个下划线开始(但不是结束),他是似有的;其他所有的都是公有的。python没有类方法保护的概念(只能用于他们自己的类和子类中)。










阅读(698) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~