

(二)类/对象的创建、使用
OOP的方法:
(1)创建类及其派生类的属性、事件和方法。
(2)利用类创建对象。
(3)为对象设置各种属性。
(4)为对象设定相关事件。
(5)为事件设计相应的方法。
(6)利用图形用户界面(Graphical User Interface,GUI),完成对象之间的相互调用,并实现最终的应用程序。
类
类:一组性质相同的对象的统一抽象描述。即:对象的数据、对象的操作事件以及事件的处理方法等。类是对象的抽象描述。
例如:按钮类的抽象信息:
按钮的数据:数据定义为宽、高和名称。数据默认值定义为:宽为30个像素,高为10个像素,名称为“按钮”。
按钮的操作事件:对按钮进行的操作。如:单击。
事件的处理方法:单击按钮之后,需要做的具体处理方法。如:单击按钮之后,显示信息“欢迎使用Python!”。每一种处理方法对应一个函数。
根据上述描述,可以定义一个拥有具体数据(宽、高和名称)、默认数据(30、15、按钮)、确定操作事件(单击)以及相应操作方法的按钮类。
显然,用户可以使用按钮类,创建进行操作控制的按钮(对象),且只需给出宽、高和名称三个数据,然后编写相应的处理程序即可。
2. 对象
对象:客观存在的事物(拥有具体内容的类)。即:对象是拥有具体数据和确定操作及其方法的类的实例。对象是具体的类,类的实例。
例如:创建能够进行加法运算的按钮对象。只需要给出宽、高和名称的数据:50、20、“加法运算”,然后编写一个进行加法运算的方法(函数)add()。
3. 属性
属性:描述对象的数据。不同的对象可以定义不同的属性。
例如:按钮类的宽、高和名称是按钮对象的属性,不同的属性可以定义不同的按钮。
即:分别利用数据:40、20、“确定”和40、20、“取消”,则可以定义了两个按钮:“确定”按钮和“取消”按钮。
创建类可以使用class。
class 类名:
属性1=值1
……
属性n=值n
方法1
……
方法m
属性:对应相应的变量。
方法:对应相应的函数。
创建对象可以使用类名来实现。即:
对象=类名([ 参数 [,…,参数 ] ])
利用dir(),可以查看类和对象的属性和方法。
class testc:
x=10
y=20
def fu1(self):
return self.x+self.y
def add(u,v):
return u+v
def fu2(self,w):
return self.x+w
>>> dir(testc)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add', 'fu1', 'fu2', 'x', 'y']
>>> tc=testc()
>>> dir(tc)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add', 'fu1', 'fu2', 'x', 'y']
思考:如果把上述类中的add()方法,改为如下内容,结果如何:
def add(self,u,v):
return u+v
提示:在设计类的方法时,通常把self作为第一个参数。
注意:以双下划线开头的属性和方法,只能在类(对象)的内部使用,属于局部属性和局部方法,不能在类(对象)外使用。
例6.2:创建一个正方形类squa,属性边长为length,默认值为10,方法为周长squazc();然后创建正方形对象sq;最后利用sq输出正方形的边长和周长。
#pro0602.py
class squa:
length=10
def squazc(self):
return 4*self.length
sq=squa()
print('正方形的边长:',sq.length)
print('正方形的周长:',sq.squazc())
在基类的基础上,创建子类的方法:
class 子类(基类):
属性1=值1
……
属性n=值n
方法1
……
方法m
属性和方法:子类的属性和方法。在子类中,可以使用基类的属性和方法(继承性)。
例6.3:在正方形类squa的基础上,创建长方形类rect(子类),基类的边长作为长方形的长边;在子类中添加新属性width(默认值:20)作为宽边;在子类中添加的新方法为长方形周长rectzc();然后创建长方形对象re;最后利用re输出长方形的边长和周长。
#pro0603
class squa:
length=10
def squazc(self):
return 4*self.length
class rect(squa):
width=20
def rectzc(self):
return 2*(self.length+self.width)
re1=rect()
print('长方形的长和宽:',re1.length,re1.width)
print('长方形的周长:',re1.rectzc())
显然,在长方形类rect中,使用了正方形类squa中属性length。
注意:self是类的默认对象,代表当前对象自身。在创建方法时,如果使用了对象自己的属性和方法,则需要传递self。
二、类和对象的使用
类的使用:使用类创建对象。
例如:在例6.2和例6.3中,分别使用正方形类和长方形类,依次创建了正方形对象sq和长方形对象re。
对象的使用:利用对象访问对象的属性和方法。即:
对象.属性
对象.方法
引用对象的属性和方法,需要使用原点“.”,表明对象与属性,对象与方法之间的隶属关系。
在使用对象时,不但可以直接使用对象属性和方法的默认值,而且还可以给属性赋予新的数据。
例6.4 利用正方形类squa和长方形类rect,输出默认边长和周长,以及修改属性值之后的边长和周长
#pro0604
class squa:
length=10
def squazc(self):
return 4*self.length
class rect(squa):
width=20
def rectzc(self):
return 2*(self.length+self.width)
sq1=squa()
print('正方形默认值:')
print('正方形的边长:',sq1.length)
print('正方形的周长:',sq1.squazc())
sq1.length=60
print('正方形修改后:')
print('正方形的边长:',sq1.length)
print('正方形的周长:',sq1.squazc())
re1=rect()
print('长方形默认值:')
print('长方形的长和宽:',re1.length,re1.width)
print('长方形的周长:',re1.rectzc())
re1.length=30
re1.width=90
print('长方形修改后:')
print('长方形的长和宽:',re1.length,re1.width)
print('长方形的周长:',re1.rectzc())

