Dive in Python学习笔记五:对象和面向对象
使用from module import导入模块
Python有两种导入模块的方法。
1. 一种方法,import module
2. 另一种方法,from module import xxx,如
from UserDict import UserDict 将UserDict直接导入到局部名字空间,可以直接使用,而不需要加上模块
名的限定。你可以导入独立的项或使用from module import * 来导入所有东西。
类的定义
Python 是完全面向对象的:你可以定义自已的类,从自已的或内置的类继承,然后从你定义的类创建实例。
Python 类以保留字class 开始,后面跟着类名。
最简单的类:
class SimpleClass:
pass
说明:在Python 中的pass 语句就像Java 或C 中的大括号空集({})。
在Python 中,类的基类只是简单地列在类名后面的小括号里。
Python 支持多重继承。在类名后面的小括号中,你可以列出许多你想要的类名,以逗号分隔。
__init__类似Java中对象的构造方法,它在类的实例创建后被立即调用(即在调用__init__时对象已经存在)。
每个类方法的第一个参数,包括__init__,都是指向类的当前实例的引用。按照习惯这个参数总是被称为self。
尽管当定义方法时你需要明确指定self,但在调用方法时,你不用指定它,Python会替你自动加上的。
Python子类的__init__方法中必须显示地调用父类的__init__方法,而不会自动调用。
Python中,__init__方法无返回值(即返回None)。
类的实例化
在Python 中对类进行实例化很直接。要对类进行实例化,只要调用类(就好像它是一个函数),传入定义在__init__ 方法中的参数。返回值将是新创建的对象。
>>> c = SimpleClass()
>>> c.__class__
说明:每一个类的实例有一个内置属性,__class__,它是对象的类。
垃圾回收
Python提供自动垃圾回收。通常,不需要明确地释放实例,因为当指派给它们的变量超出作用域时,它们会被自动地释放。
Python中有两种垃圾回收方式:
1. 引用计数
2. 标记后清除,这种方式可以正确地清除循环引用
函数重载
Python 没有任何形式的函数重载。一个__init__ 方法就是一个__init__ 方法,不管它有什么样的参数。每个类只能有一个__init__ 方法,并且如果一个子类拥有一个__init__ 方法,它总是 覆盖父类的__init__ 方法,甚至子类可以用不同的参数列表来定义它。
专用类方法
Python类可以定义专用方法。专用方法是在特殊情况下或当使用特别语法时由Python 替你调用的,而不是在代码中直接调用(像普通的方法那样)。
获得和设置数据项
def __getitem__(self, key): return self.data[key]
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__getitem__("name")
'/music/_singles/kairo.mp3'
>>> f["name"]
'/music/_singles/kairo.mp3'
说明:f["name"]会自动调用f.__getitem("name")方法
类似的__setitem__方法
def __setitem__(self, key, item): self.data[key] = item
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__setitem__("genre", 31) (1)
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':31}
>>> f["genre"] = 32 (2)
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':32}
说明:当在一个类中存取数据属性时,你需要限定属性名:self.attribute。当调用类中的其它方法时,你属要限定方法名:self.method。
其他高级专用类方法
1. __repr__ 是一个专用的方法,在当调用repr(instance) 时被调用。repr 函数是一个内置函数,它返回一个对象的字符串表示。它可以用在任何对象上,不仅仅是类的实例。
2. __cmp__ 在比较类实例时被调用。
3. __len__ 在调用len(instance) 时被调用。
4. __delitem__ 在调用del instance[key] 时调用。
说明:在Java 中,通过使用str1 == str2 可以确定两个字符串变量是否指向同一块物理内存位置。这叫做对象同一性,在Python 中写为str1 is str2。在Java 中要比较两个字符串值,你要使用str1.equals(str2);在Python 中,你要使用str1 == str2。
类属性介绍
Python支持类属性,它们是由类本身所拥有的。如下面的tagDataMap属性:
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)}
类属性既可以通过直接对类的引用,也可以通过对类的任意实例的引用来使用。
说明:Python中没有常量。
私有函数
与大多数语言一样,Python 也有私有的概念:
? 私有函数不可以从它们的模块外面被调用
? 私有类方法不能够从它们的类外面被调用
? 私有属性不能够从它们的类外面被访问
与大多数的语言不同,一个Python 函数,方法,或属性是私有还是公有,完全取决于它的名字。
如果一个Python 函数,类方法,或属性的名字以两个下划线开始(但不是结束),它是私有的;其它所有的都是公有的。Python 没有类方法保护 的概念(只能用于它们自已的类和子类中)。类方法或者是私有(只能在它们自已的类中使用) 或者是公有(任何地方都可使用)。
说明:专用方法以双下划线开始,也以双下划线结束,因此不是私有方法
补充:Web开发 , Python ,