开发工具与关键技术:Python IDEL、Python
作者:曾浩源
撰写时间:2019年07月25日

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的,向对象最重要的概念就是类(Class)和实例(Instance)。
创建一个类和C语言差不多,例如我创建一个常见的例子,动物(Animal)类:

class Animal:
	pass

虽然是个空的类,但创建一个类就是这么简单。

接下来就是实例化该类:

python设计一个表示动物的类Animal python创建一个animal类_Python


创建实例是通过类名+()实现的,可以看到,变量cat指向的就是一个Animal的object,后面的0x000001717F2E9A20是内存地址,每个object的地址都不一样,而Animal本身则是一个类。

像这种属性,在C语言的时候有一个叫构造函数的东西,可以为类提前设置一些属性,到时候实例化的时候直接复制就行了,当然Python也可以,就是使用Python的内置函数(一般前后拥有双下划线的函数都是Python的内置函数)__init__() 如:

class Animal:
	def __init__(self,name,age):
		self.name = name
		self.age = age

python设计一个表示动物的类Animal python创建一个animal类_Python_02


和java或C语言差不多,但这self是什么?

和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数和关键字参数。
self 是一个形式参数,当执行 cat = Animal(‘cat’, 18 ) 时,self 等于 cat
当执行 dog = Animal(‘dog’, 78 ) 时,self 等于 dog

类除了定义属性以外,还有函数呀,创建类里的函数刚刚说了,第一个函数永远是self,那么就定义一个函数:

class Animal:
	def __init__(self,name,age):
		self.name = name
		self.age = age
	def sleep(self):
		print('我睡着了!')

python设计一个表示动物的类Animal python创建一个animal类_Python_03


如何使用类里的属性?之前说的self就派上用场了。

class Animal:
	def __init__(self,name,age):
		self.name = name
		self.age = age
		
	def sleep(self):
		print('我是' + self.name + ',大家晚安!')

python设计一个表示动物的类Animal python创建一个animal类_实例变量_04


面向对象语言都一样,都有以下的特点:

1、类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
2、类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
3、数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
4、方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
5、实例变量:定义在方法中的变量,只作用于当前实例的类。
6、继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,素以Dog也是一个Animal。
7、实例化:创建一个类的实例,类的具体对象。
8、方法:类中定义的函数。
9、对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

Python类小结:

类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都不相同;

通过在实例变量上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。

和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同:

python设计一个表示动物的类Animal python创建一个animal类_实例变量_05


这些是什么?这些就是面向对象的三大特征之一的封装。

搞懂了这个,那么三大特征里的继承也就轻而易举。