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