python 学习笔记 --- python的类

1 创建类

使用 class 关键字来创建一个类。

1
2
3
class ClassName:
'类的注释'
class_suite #类体

类的注释可由 ClassName.doc 来查看。class_suite 由类的成员、方法、属性组成

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#-*- coding:utf-8 -*-
class Student:
'学生'
def __init__(self, name,sex,num):
self.name = name
self.sex = sex
self.num = num

def displayInfo(self):
print "Name:",self.name,",Sex:",self.sex,",Num:",self.num

def __del__(sefl):
class_name = self.__class__.__name__
print class_name,'Deleted'
  • init() 可以看作是类的构造函数。(其实类的构造函数是 new ,它是一个类方法 ,在类的实例初始化之前调用。init 实际是类的初始化函数)

  • self 代表类的实例,类的方法必须有一个额外的形参,按惯例它的名称为self,但在调用时不必传入该参数。

  • del() 是类的析构函数,在对象被销毁的时候调用。

2 类的实例

要创建一个类的实例,可以调用该一特殊的函数来完成。该函数的名称为类的名称,参数为该类的 init()的参数。

1
2
3
4
5
6
7
8
9
10
>>> from Student import Student
>>> s = Student('A',1,1)
>>> s.displayInfo()
Name: A ,Sex: 1 ,Num: 1
>>> print s.name #属性
A
>>> print s.__doc__
学生
>>> print Student.__doc__
学生

还可以使用下列函数来访问属性:

  • getattr(obj,name[,default]) 访问对象的属性

  • hasattr(obj,name) 检查是否存在一个属性

  • setattr(obj,name,value) 设置一个改改。如果不存在,则创建之

  • delattr(obj,name) 删除一个属性

3 内置类属性

  • doc: 类的注释

  • dict: 类的属性(包括一个字典,由类的数据属性组成)

  • name: 类的名称

  • module: 类定义所在的模块

  • bases: 类的所有父类构成的元素

4 对象销毁

python 内部使用引用计数来跟踪和回收垃圾。当对象被创建时,就创建了一个引用计数,当这个对象的引用计数为0时,对象不再被需要,它会有合适的时候被垃圾回收器回收。

垃圾回收机制不仅针对引用数据为 0 的对象,也可以处理循环引用的情况。 循环引用 是指两个对象相互引用,但是没有其它的变量引用他们。在这种情况下,引入数据可能一直不为0。作为引用计数的补充,垃圾收集器会留心被分配的总量很大的对象,在这种情况下,解释器会停下来,试图清理所有的未引用的循环。

5 类的继承

1
2
3
class SubClassName(ParentClass[,ParentClass,...]):
"""类注释"""
class_suite

在 python 中,继承有一些特点:

  • 在继承中类型的构造函数不会被自动调用,它需要在其派生类的构造函数中亲自调用

  • 在调用基类方法时,需要加上基类的类名前缀,且需要带上self参数变量。

  • python 调用方法时总是先在该类中查找,找不到对应的方法才开始到基类中查找

可以使用issubclass() 或者 isinstance() 方法来检测类的继承关系:

  • issubclass(sub,sup) 判断一个类是另一个类的子类或子孙类

  • isinstance(obj,class) 如果obj是类class的实例对句,或是其子类的实例对象,则返回true

6 运算符重载

python 支持运算符重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-*- coding:utf-8 -*-
class Vector:
"""向量"""
def __init__(self,a,b):
self.a = a
self.b = b

def __str__(self):
"""重写 str() 函数"""
return "Vector(%d,%d)"%(self.a,self.b)

def __add__(self,other):
"""重写 add() 函数"""
return Vector(self.a + other.a, self.b + other.b)

if __name__ == '__main__':
v1 = Vector(1,2)
v2 = Vector(3,5)
print str(v1 + v2)

以上代码的招待结果为:

1
Vector(4,7)

7 类属性与方法

  • 类的私有属性 __private_attrs: 两个下划线开头,声明为局长属性为私有,不能在类的外部访问。在类的内部使用时,写作: self.__private_attrs . 但是 python 可以使用 obj._className__attrName 来访问私有变量

  • 类的方法 使用 def 定义。其第一个参数必须是该类的实例对象,一般写作self

  • 类的私有方法 __private_method: 两个下划线开头,声明该方法为私有方法,不可以在类的外部调用。