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: 两个下划线开头,声明该方法为私有方法,不可以在类的外部调用。