Python完全采用了面向对象的程序设计的思想,是真正面向对象的高级动态编程语言。支持面向对象的基本功能,如继承、封装、多态以及对基类方法的重写与覆盖。但和其他面向对象程序设计语言不同的是,python中对象的概念很广泛,python中的一切内容都是可以称为对象的。
python使用class关键字来定义类的,class关键字之后是一个空格,然后是类的名字,再然后是一个冒号,最后换行定义类的内部实现。类名的首字母一般是要大写,当然也可以按照自己的习惯定义类名
1. 定义和使用类
创建类时用变量表示的对象属性称为数据成员或属性(成员变量),用函数形成式表示的对象的行为称为成员函数(成员方法),成员属性和成员方法统称为类的成员
在Person类中定义一个成员函数SayHello(self), 用于输出字符串"Hello",同样的python中是使用缩进标识类的定义代码
A、 成员函数(成员方法)
在python中,函数和成员方法(成员函数)是有区别的。成员方法一般是指与特定实例绑定的函数,通过对象调用成员方法时,对象本身将被称为第一个参数传递过去,普通函数是不具备这个特点的。
B、 self
在成员函数SayHello()中有一个参数self。这个也是类成员函数(方法)与普通函数的主要区别。类的成员函数是必须有一个参数self,而且位于参数列表的开头。Self就代表类的实例(对象)本身,额可以使用self 引起类的属性和成员函数。在类的成员函数中访问实例属性时需要以self为前缀,但在外部通过对象名调用对象成员函数时是不需要传递这个参数,如果在外部通过类名调用对象成员函数则需要显示为self参数传值。
2. 对象定义
对象是类的实例。如果人类是一个类的话,那么某个具体的人就是一个对象。只有定义了具体的对象,并通过"对象名.成员"的方式来访问其中的数据成员或成员方法。
Python中创建对象的语法如下:
对象名 = 类名()
2.1 构造函数
类可以定义一个特殊的叫做__init__()方法(构造函数,以二个下划线开头和结束)。一个类定义了__init__()方法之后,类实例化就会自动为新生成的类实例调用__init__()方法。构造函数一般用于完成对象数据成员设置初值或进行其他必要的初始化工作。如果用户未涉及到构造函数,python将会提供一个默认的构造函数。
2.2 析构函数
Python中的析构函数是__del__,用来释放对象占用的资源,在python收回对象空间之前自动执行。如果用户未涉及析构函数,python将提供一份默认的析构函数进行必要的清理工作。
【在删除x对象变量之前,x是存在的,在内存职工的标识0x0000020AEB536668,执行del x语句之后,x对象变量就不存在了,系统就会自动调用析构函数,所以出现Comppliex 不存在了】
2.3 实例属性和对象
属性(成员变量)有二种:一种是实例属性,还有一种是类属性(类变量)。实例实现是在构造函数__init__中定义的,定义是以self作为前缀的。类属性是在类中方法之外定义的属性的。在主程序中(在类的外部),实例属性实例(对象),只能通过对象名
访问;类属性属于类可通过类名访问,也可以通过对象名访问,为类的所有实例共享
【num变量是一个类变量,它的值将在这个类的所有实例之间共享。 你可以在类内部或类外部使用Person.num 访问】
2.4 动态增加属性
Python中比较特殊的是,可以动态的为类和对象增加成员,这一点是和很多的程序设计语言是不同的,也是python动态类型特点的一种重要体现。
2.5 私有成员和公用成员
Python中并没有对私有成员提供严格的访问保护机制。在定义类的属性时,如果属性名是以二个下划线__开头则表示是私有属性。私有属性在类的外部是不能之间访问的,需要通过调用对象的公用成员的方法来访问的,或者是通过python支持的特殊方法来访问。Python提供了访问私有属性的特殊方法,可用于程序的测试和调试,对于成员方法也是具有同样的性质。这种方式如 对象名._类名+ 私有成员
例如:访问Car类私有成员_weight : car1._Car1__weight
私有属性是为了数据封装和保密而设的属性,一般只能在类的成员方法(类的内部)中使用访问,虽然python支持一种特殊的方式从外直接访问类的私有成员,但是并不建议这样做。公用属性的可以公开使用的,既可以在类的内部使用,也可以在外部程序中使用。
最后一句是不能直接访问私有属性,所以报错。而公有属性color是可以直接访问的。
2.6 方法
在类中定义的方法大致可以分为3大类:公有方法、私有方法、静态方法。其中,共有方法、私有方法都是属于对象,私有方法的名字以二个下划线__开始的,每个对象都是有自己的公有方法和私有方法,在这二类方法中可以访问属于类和对象的成员;公有方法通过对象名直接调用,私有方法是不能通过对象名直接调用,只能在属于对象的方法通过self调用或在外部通过python支持的特殊方法调用。如果通过类名来调用属于对象的公用方法,需要显示为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员,静态方法可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员