1、计算机编程导论,课程建设组 编著,2014.11,为了解决大型软件设计危机,在20世纪80年代提出了面向对象程序设计(object oriented programming, OOP)。面向对象程序设计是一种新的编程模式,这种编程模式的中心不再是程序的逻辑流程,而是软件或程序中的对象以及对象之间的关系。面向对象程序设计是针对大型软件的设计而提出的,它能使功能相对独立,能很好地做到代码重用,能使软件易于维护。,【问题8-1】定义一个类代表三角形,类中含三条边、求周长的函数,求面积的函数。然后用这个类生成一个等边三角形,一个直角三角形,依次求其周长及面积。 程序: #Ques8_1.py,clas
2、s Triangle:def _init_(self, x, y, z):self.a=xself.b=yself.c=zdef area(self):s=(self.a+self.b+self.c)/2return (s*(s-self.a)*(s-self.b)*(s-self.c)*(1.0/2)def perimeter(self):return self.a+self.b+self.c,#主程序 t1=Triangle(6, 6, 6) #等边三角形是t1,t1也称对象 t2=Triangle(3, 4, 5) print “等边三角形的三条边:“, t1.a, t1.b, t1.c
3、 print “等边三角形的周长:“, t1.perimeter() print “等边三角形的面积:“, t1.area() print “直角三角形的三条边:“, t2.a, t2.b, t2.c print “直角三角形的周长:“, t2.perimeter() print “直角三角形的面积:“,t2.area(),程序运行结果: 等边三角形的三条边: 6 6 6 等边三角形的周长: 18 等边三角形的面积: 15.588457268119896 直角三角形的三条边: 3 4 5 直角三角形的周长: 12 直角三角形的面积: 6.0,8.2.1 类和对象创建类时用变量表示属性称为成员变
4、量或成员属性,用函数表示方法称为成员函数或成员方法,成员属性和成员方法都称为类的成员。类Triangle有哪些成员变量?哪些成员方法?1. 类和对象的区别类是客观世界中事物的抽象,而对象是类实例化后的变量。例如,建房图纸可以建造出不同的房子,建房图纸是类,不是真实的房子,而建造出的每间房子都是对象。,2. 类的定义Python使用class保留字来定义类,类名的首字母一般要大写。如,class Car:def infor(self):print(“ This is a car “) 类的方法至少有一个参数self,self代表将来要创建的对象本身。在类的方法中访问类的实例属性时需要以self为
5、前缀(下面将学习)。,8.2.2 实例属性和类属性 属性有两种,一种是实例属性,另一种是类属性。实例属性是在构造函数_init_中定义的,定义时以self作为前缀;类属性是在类中方法之外定义的属性。在主程序中(在类的的外部),实例属性属于实例(对象)只能通过对象名访问;类属性属于类可通过类名访问。在类的方法中可以调用类的其它方法,可以访问类属性、对象属性。,【例8-1】 实例属性和类属性。 程序: #Exp8_1.py class Car:price=100000 #定义类属性def _init_(self, c):self.color=c #定义实例属性,#主程序 car1=Car(“Red
6、“) car2=Car(“Blue“) print car1.color, Car.price Car.price=110000 #修改类属性 Car.name=QQ #增加类属性 car1.color=“Yellow“ #修改实例属性 print car2.color, Car.price, Car.name print car1.color, Car.price, Car.name,程序运行结果: Red 100000 Blue 110000 QQ Yellow 110000 QQ,如果属性名以双下划线_开头则是私有属性,否则是公有属性。私有属性在类外不能直接访问。Python提供了访问私
7、有属性的方式,可用于程序的测试和调试。私有属性是为了数据封装和保密而设的属性,只能在类的成员方法(称为类的内部)中使用,通过self访问。公有属性是可以公开使用的,既可以在内部使用,也可以在外部(通过对象名访问)使用。,8.2.3 类的方法,类有3种方法:公有方法、私有方法和静态方法。 双下划线_开头则是私有方法, 上一行用 staticmethod 标识的方法是静态方法, 否则是公有方法。公有方法、私有方法都属于对象,每个对象都有自己的公有方法和私有方法;公有方法通过对象名调用,私有方法不能通过对象名调用,只能在属于对象的方法中通过self调用;静态方法属于类,静态方法只能通过类名调用,静态
8、方法中不能访问属于对象的成员,只能访问属于类的成员。,【例8-3】 公有方法、私有方法和静态方法的定义和调用。,#Exp8_3.py class Fruit:price=0def _init_(self):self._color=Red #定义和设置私有属性colorself._city=Kunming #定义和设置私有属性citydef _outputColor(self): #定义私有方法outputColorprint(self._color) #访问私有属性colordef _outputCity(self): #定义私有方法outputCityprint(self._city) #访
9、问私有属性city,def output(self): #定义公有方法outputself._outputColor( ) #调用私有方法outputColorself._outputCity( ) #调用私有方法outputCity staticmethoddef getPrice(): #定义静态方法getPricereturn Fruit.price staticmethoddef setPrice(p): #定义静态方法setPriceFruit.price=p,#主程序 apple=Fruit() apple.output() print(Fruit.getPrice( ) Frui
10、t.setPrice(9) print(Fruit.getPrice( ) apple._outputColor( ) #是否可行? 思考:能否添加公有方法,以便能通过对象名访问私有成员变量_color?,程序运行结果: Red Kunming 0 9,8.2.4 构造函数,Python中类的构造函数是_init_,用来为属性设置初值,在建立对象时自动执行。8.2.5 析构函数 Python中类的析构函数是_del_,用来释放对象占用的资源,在Python收回对象空间之前自动执行。,【例8-5】 构造函数和析构函数。,#Exp8_5.py class Car :def _init_(self,
11、 n):self.num=nprint 编号为, self.num, 的对象出生了.def _del_(self):print 编号为, self.num, 的对象死了. car1=Car(1) car2=Car(2) del car1 del car2,程序运行结果: 编号为 1 的对象出生了. 编号为 2 的对象出生了. 编号为 1 的对象死了. 编号为 2 的对象死了.,练习:设计一个类代表长方体,含有长、宽、高三个对象属性,含有计算体积的公有方法、计算表面积的公有方法。编写主程序,生成一个一般长方体,生成一个正方体。第11次上机作业 1. 运行、理解本次课所讲例题。 2. 8.1 3. 8.2,