Python类
类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。Python也支持类类型。
在python中类的定义通过关键字class,紧接着是(object),表示该类是从哪个类继承下来的,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
class 类名(obeject):
类的主体
创建实例是通过类名+()实现
在C++中,在定义类的时候就将类中的数据成员和方法(函数)定义,在创建实例的时候将类中的数据成员进行初始化。在python中,类中的数据成员成为类的数据属性,但是它们又分为类数据属性和实例数据属性;类中的方法通过在类中进行函数的定义实现。
数据属性
不像c++中在类的定义时候就一定需要将成员数据确定,在python中,数据属性可动态添加和删除,删除属性通过del关键字实现,数据属性分为类数据属性和实例数据属性。类数据属性在实例生成的时候绑定或者是可以通过类名动态添加类数据属性,新增的类属性也被类和所有实例共有。在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例,该属性为实例属性。
#类的定义
class
MyClass
(
object
)
:
def
__init__
(
self
,
name0
,
age0
)
:
self
.name
=
name0
self
.age
=
age0
student
=
MyClass(
"Chen"
,
10
)
#生成实例,实例括号后面跟的参数对应是__init__除了self之外的参数
print
"name:%s,age:%d"
%
(student.name,student.age)
#打印student实例的信息,name:Chen,age:10
MyClass.sex
=
"male"
#动态向类中添加数据属性
print
"name:%s,age:%d,sex:%s"
%
(student.age,student.age,student.sex)
#此时MyClass实例中的数据属性多了sex,则Myclass的实例也多了sex属性,打印出来的结果为name:10,age:10,sex:male
student1
=
MyClass(
"Yello"
,
100
)
print
"student1 name:%s,age:%d,sex:%s"
%
(student1.age,student1.age,student1.sex)
#student1实例的属性包含了sex属性
student1.weigh
=
"100Kg"
#实例stuent1增加weigh属性
student1.sex
=
"female"
#修改student中的sex属性
print
"student1 name:%s,age:%d,sex:%s,weigh:%s"
%
(student1.age,student1.age,student1.sex,student1.weigh)
#此时的结果为修改的属性后的值student1 name:100,age:100,sex:female,weigh:100Kg
#print "student name:%s,age:%d,sex:%s,weigh:%s"%(student.age,student.age,student.sex,student.weigh)由于student1实例添加的weigh的属性,在student中没有weigh属性,因此会报错
特殊的类属性,对于所有的类,都有一组特殊的属性
类属性
|
含义
|
__name__
|
类的名字(字符串)
|
__doc__
|
类的文档字符串
|
__bases__
|
类的所有父类组成的元组
|
__dict__
|
类的属性组成的字典
|
__module__
|
类所属的模块
|
__class__
|
类对象的类型
|
注意,虽然通过实例可以访问类属性,但是,不建议这么做,最好还是通过类名来访问类属性,从而避免属性隐藏带来的不必要麻烦。
方法
Python的类中一共有三种方法:实例方法、静态方法和类方法。这三种方法的主要区别在于参数,实例方法被绑定到一个实例,只能通过实例进行调用;但是对于静态方法和类方法,可以通过类名和实例两种方式进行调用。
实例方法
实例方法只能通过类实例进行调用,实例方法的第一个参数必须是”self”,”self”类似于C++中的”this”,这”self”就代表这个类实例本身,通过”self”可以直接访问实例的属性。
类方法
类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod装饰器。通过cls可以访问类的相关属性。
静态方法
与实例方法和类方法不同,静态方法没有参数限制,既不需要实例参数,也不需要类参数,定义的时候使用@staticmethod装饰器。同类方法一样,静态法可以通过类名访问,也可以通过实例访问。