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

说明:专用方法以双下划线开始,也以双下划线结束,因此不是私有方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值