python 学习笔记 — python的类
目录
1 创建类
使用 class 关键字来创建一个类。
class ClassName:
'类的注释'
class_suite #类体
类的注释可由 ClassName.__doc__ 来查看。class_suite 由类的成员、方法、属性组成
实例
#-*- 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__()的参数。
>>> 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 类的继承
class SubClassName(ParentClass[,ParentClass,...]):
"""类注释"""
class_suite
在 python 中,继承有一些特点:
- 在继承中类型的构造函数不会被自动调用,它需要在其派生类的构造函数中亲自调用
- 在调用基类方法时,需要加上基类的类名前缀,且需要带上self参数变量。
- python 调用方法时总是先在该类中查找,找不到对应的方法才开始到基类中查找
可以使用issubclass() 或者 isinstance() 方法来检测类的继承关系:
- issubclass(sub,sup) 判断一个类是另一个类的子类或子孙类
- isinstance(obj,class) 如果obj是类class的实例对句,或是其子类的实例对象,则返回true
6 运算符重载
python 支持运算符重载
#-*- 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)
以上代码的招待结果为:
Vector(4,7)
7 类属性与方法
- 类的私有属性 __private_attrs: 两个下划线开头,声明为局长属性为私有,不能在类的外部访问。在类的内部使用时,写作: self.__private_attrs . 但是 python 可以使用 obj._className__attrName 来访问私有变量
- 类的方法 使用 def 定义。其第一个参数必须是该类的实例对象,一般写作self
- 类的私有方法 __private_method: 两个下划线开头,声明该方法为私有方法,不可以在类的外部调用。