Bootstrap
本文主要介绍Python面向对象的相关知识,面向对象编程好处在于,面向对象编程的代码更容易维护,可扩展性也比较多,代码更容易重复使用。

1、创建Python类

class  MyFirstClass:
    pass

这就是一个最简单的Python类

2、Python对象初始化

其它编程语言中都有构造函数来实现对象初始化,一般构造函数是与类名相同的,而Python是用__init__函数来实现对象的初始化,例如,

Class Cat:
    def __inif__(self,name,color):
        self.name=name;
        self.color=color;

上面代码中self相当于其它语言中this,类中所有的实例方法都必须有个参数。

3、Python中的继承

1)基本继承

Python所有类都是object的特殊类的子类,这个和其它语言中的类似,我们不指定父类,类是自动从object继承过来。我们也可以显示声明从object类继承,例如,

class MySubClass(object):
    pass

2)扩展内置类

我们可以通过继承将一些内置类做一下扩展增加功能,比将list增另加搜索方法,例如,

class ExtList(list):
    def search(self,name):
        matching_list=[]
        for item in self:
            if  hasattr(item,"name") and name in item.name:
                matching_list.append(item)  
       return matching_list

3)重写和Super

重写就是在子类里用一个(和父类相同的方法)新的方法来改变或覆盖父类里的这个方法。做这个不需要特殊的语法,会自动执行子类新创建的方法而不是父类的。

class Animal:
    def __init__(self,name):
        self.name=name
class Cat(Animal):
    def __inif__(self,name,color):
        self.name=name
        self.color=color

上面代码中__init__方法被重写了,任何方法都可以被重写。我们可能还需要调用父类中的方法,这样可能可以使用代码更简单。上面代码可以改成这样:

class Cat(Animal):
    def __inif__(self,name,color):
        super().__init__(name)
        self.color=color

4)多重继承

多重继承的语法就像类定义里的参数列表。括号里可以包含两个或者更多的基类而不是一个,这些基类使用逗号分隔开来。
多重继承主要的问题就是容易出现父类方法被调用多次的问题,解决这个问题调用父类的方法要用super来调用,super代表调用的是下一个方法,这样就不会有父类方法被重复调用多次的问题。保证每个父类方法被调用
一次。所以多重继承不要直接用类名调用父类方法,要用super来调。

5)多态

调用不同的子类将会产生不同的行为,而不需要知道这个子类实际上是什么。

class AudioFile:
    def __init__(self, fileName):
        if not fileName.endswith(self.ext):
            raise Exception("Invalid file format")
    def play(self):
        print("playing %s as  %s"%(self.filename,self.ext))
class MP3File(AudioFile):
     ext = "mp3"
class WavFile(AudioFile):
     ext = "wav"
class OggFile(AudioFile):
    ext = "ogg"
def getPlayer(fileName):
    if fileName.endswith("mp3"):
        return MP3File(fileName)
    elif fileName.endswith("wav"):
        return WavFile(fileName)
    elif fileName.endswith("ogg"):
        return OggFile(fileName)
    else:
        print("error")
if __name__ == "__main__":
    fileName = "/home/levi/1.mp3"
    player = getPlayer(fileName)
    player.play()

上面代码中player调用play方法,不用考虑是哪个子类,直接调用play方法就行了。不同的文件类型会产生不同的行为。这就是多态。