前面一节讲到面向对象的封装原则,封装就是把现实世界同类事物的共同特征和行为抽取出来,放到一个新建的Python类中,并设置类属性(特征)和行为,同时提供外部访问类属性和行为的方法。
类是把同类事物的共同特征和行为封装在一起的结构体,事物的特征称为属性,事物的行为称为方法,类是抽象的概念集合,表示的是一个共性的产物,类中定义的是属性和方法。例如前面一节创建的Fruits类(水果类),Fruits类有属性water(汁液含量)、sugar(糖分含量)、fragrance(芳香度),这些属性是水果类所具有的共同特点:汁液含量丰富、糖分含量大、有一定程度的芳香气味。Fruits类也有方法类获取类属性和设置类属性的方法。
在Python中,通过关键字class来声明类,类声明语法如下:
#声明一个类 class 类名: #定义类属性部分 _属性1; __属性2; …… 属性n; #构造方法 def __init__(self): 类初始化语句; #定义类的方法 _方法1; 方法2; …… 方法n;
一个完整的Python类由类声明和类主体构成,类主体内容放在在类声明之后。
类声明语句为“class 类名”,其中class是Python预定义的关键字,声明Python类时,类声明需要包含class关键字。
在声明类属性和方法时,可以声明类属性和方法的访问权限。访问权限分为public(公共访问权限)、protected(保护访问权限)、private(私有权限)。声明为public权限的类属性和方法可以允许外部直接访问该属性或调用该方法;声明为protected权限的类属性和方法只能允许类本身与子类访问和调用;声明为private权限的类属性和方法只能允许类本身访问和调用,其继承的子类也没有权限访问和调用。
Python默认的类属性和方法都是public权限,也就是在属性和方法前面不加任何修饰符;在属性和方法前面加单下划线“_”修饰符,可以修饰该属性或方法为protected权限;在属性和方法前面加双下划线“__”修饰符,可以修饰该属性或方法为private权限。
在名称前后均有单下划线“_”的属性或方法,定义的是特殊属性或方法。如上面代码中的构造方法__init__,这些属性或方法一般都是在Python内部定义。
例1:声明一个日期类。
#声明一个日期类
class Date:
#声明类属性
year = "";
month = "";
day = "";
#声明方法
#构造函数
def __init__(self, inyear, inmonth,inday):
self.year = inyear;
self.month = inmonth;
self.day = inday;
#判断是否是闰年
def isRunnian(self):
if (self.year % 4 == 0 and self.year % 100 != 0) or (self.year % 400 == 0):
return True;
else:
return False;
#输出日期
def printDate(self):
print("%s-%s-%s" % (self.year,self.month,self.day))声明的日期类有year、month、day三个属性,用来存储日期的年、月、日。另外,日期类还提供了isRunnian()和printDate ()两个方法,isRunnian()用于判断当前日期是否是闰年,printDate ()用于输出当前日期。
在声明Python类时,还有一个简洁的方法。不用显示声明类的属性,在类的方法中直接定义类的属性即可。
#声明一个日期类
class Date:
#构造函数
def __init__(self, inyear, inmonth,inday):
self.year = inyear;
self.month = inmonth;
self.day = inday;
#判断是否是闰年
def isRunnian(self):
if (self.year % 4 == 0 and self.year % 100 != 0) or (self.year % 400 == 0):
return True;
else:
return False;
#输出日期
def printDate(self):
print("%s-%s-%s" % (self.year,self.month,self.day))从现实世界的事物中抽取特征并归纳为类,对Python初学者或项目经验缺乏者确实有一定的难度。不过也无须担心,从现实世界的事物中抽取特征并归纳为类属于项目的需求分析阶段,是系统分析员做的事情。在实际工作中,项目涉及到的类及属性和行为在需求规格说明书和系统设计文档中已经详细给出,程序员只需按照文档要求创建项目和编写类代码就可以了。