Python中的面向对象的程序设计
1、创建类和实例对象
我们通过一个简单的例子来一步步说明:
class Myscore:
"我的得分。"
myscorect=0
def __init__(self,allis):
self.allis=allis
Myscore.myscorect+=1
def getis(self.bitt):
self.allis+=bitt
self.displayscore()
def subis(self.bitt):
self.allis-=bitt
self.displayscore()
def displayscore(self):
print '最后得分:',self.allis
class语句创建了一个新的名为Myscore的类。这个类有一个文档字符串"我的得分。"(可以使用Myscore.__doc__来访问),还有三个方法。
在 类中声明方法就像声明普通的函数一样,除了第一个参数必须是self。这个self就是类的实例本身(对象)。你在调用这些方法的时候不必包含self, Python为你做了。这第一个方法是构造器或者说是一个初始化方法,当你创建这个类的一个新的实例时Python调用它。
对象有两个类型的数据成员:myscore存在于所有方法这外,它是一个类变量,这就意味这个类的所有实例共享它。如果在一个实例中改变它的值,这将影响到所有其它的实例。下面我们看一下:
>>> x=Myscore(); y=Myscore()
>>> print x.myscore,y.myscore
2,2
另外的数据成员是实例变量,它们在方法中定义并只属于该实例,各实例互不影响。allis就是实例变量。不论是方法和变量,都必须通过self来引用。
2、创建实例对象
要创建一个类的实例,你必须调用这个类,并传递给它__init__方法所需的参数,你可以使用点号.来访问实例的属性:
>>> s=Myscore(50)
>>> s.getis(100)
最后得分:150
>>> s.subis(25)
最后得分:125
>>> s.allis
125
类的实例使用了一个字典来容纳实例的属性和属性值。object.attribute是和object.__dict__['attribute']一样的。另外每个对象和类都有另外一些特殊的成员:
>>> Myscore.__name__ #类名
'Myscore'
>>> Myscore.__module__ #类的定义所在模块
>>> s.__class__ #这个对象所属的类定义
>>> s.__doc__ #文档字符串
'我的得分。'
3、访问属性
你可以在任何时候添加、删除或修改类和实例对象的属性:
>>> s.myname="tom" #添加一个myname属性
>>> del s.myname #删除属性myname
修改一个类的定义将影响它的所有实例:
>>> Myscore.color='red' #增加一个类变量
>>> s.color
'red'
注意如果你想使用一个实例来改变它的类的变量是不可能的:
>>> s.color='blue'
>>> Myscore.color
'red'
除了使用通常的语句访问属性外,你还可以使用getattr,hasattr,seattr,deattr等函数来访问属性。
如同函数一样,方法也可以有数据属性。注意下面例子的deletexx.docx:
>>> class Xclass:
... def deletexx(self,yy):
... os.destroyFiles(yy)
... deletexx.docx='mmm iii sss'
>>> hasattr(Xclass.deletexx,'docx')
1
>>> Xclass.deletexx.docx
'mmm iii sss'
4、从一个类创建出一个新类
你可以从一个类(父类)创建出一个新类(子类),这就是所谓的派生。
>>> class you:
... age=30
... def yweight(self):
... print '60kg'
... def high(self):
... print '1.7m'
>>> class youson(you):
... age=8
... def sweight(self):
... print '30kg'
... def high(self):
... you.high(self) #使用父类中的方法
... print '1.5m'
子类youson继承了它父类you的属性,你可以使用这些属性:
>>> ttt=youson()
>>>ttt.weight()
'60kg'
>>>ttt.sweight()
'30kg'
子类能够覆盖来自父类的数据成员和方法。例如,子类中的age的值覆盖了其父类的:
>>>ttt.age
8
high方法不是仅仅覆盖其父类的同名方法,它也调用了其父类的high方法:
>>> ttt.high()
1.7m
1.5m