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 没有类方法保护 的概念(只能用于它们自已的类和子类中)。类方法或者是私有(只能在它们自已的类中使用) 或者是公有(任何地方都可使用)。

 

说明:专用方法以双下划线开始,也以双下划线结束,因此不是私有方法

 

 


摘自 蓝猫的专栏
 

相关内容

    暂无相关文章

评论关闭