Python面向对象编程
1.面向过程编程
以函数为单元,一组函数的顺序执行
#面向过程 lang1={'name':'C++','score':'9.0'} lang2={'name':'Python','score':'8.5'} def langinfo(lang): print '%s:%s'%(lang["name"],lang["score"]) langinfo(lang1) langinfo(lang2)
运行结果:
2.面向对象编程
以对象为单位,对象拥有属性和方法
#面向对象 class Lang(object): def __init__(self,name,score): self.name=name self.score=score def langinfo(self): print '%s:%s'%(self.name,self.score) lang1=Lang('C++','9.0') lang2=Lang('Python','8.5') lang1.langinfo() lang2.langinfo()
运行结果:
3.封装
对象可提供属性和方法,供外部调用,隐藏内部实现细节,和私有信息。
私有变量:属性名称前加两个下划线__
class Lang(object): def __init__(self,name,score): self.__name=name self.score=score def langinfo(self): print '%s:%s'%(self.__name,self.score) lang1=Lang('C++','9.0') lang2=Lang('Python','8.5') print lang1.score print lang1.__name
运行结果:
可以看出,__name为私有变量(private),score为公有变量(public)
那么如何修改私有变量的值?
通过公有方法设置和获取私有变量的值:
class Lang(object): def __init__(self,name,score): self.__name=name self.score=score def langinfo(self): print '%s:%s'%(self.__name,self.score) def setName(self,name): self.__name=name def getName(self): print self.__name lang1=Lang('C++','9.0') lang2=Lang('Python','8.5') lang1.setName('C') lang1.getName()
运行结果:
4.继承
子类拥有父类的全部功能
#继承 class Lang(object): def __init__(self,name,score): self.__name=name self.score=score def langinfo(self): print '%s:%s'%(self.__name,self.score) class C(Lang): pass class Python(Lang): pass lang1=C('C++','9.0') lang2=Python('Python','8.5') lang1.langinfo() lang2.langinfo()
运行结果:
子类如何拥有自己的功能?子类中定义和父类一样类型的方法,会覆盖父类的方法
class Lang(object): def __init__(self,name,score): self.name=name self.score=score def langinfo(self): print '%s:%s'%(self.name,self.score) class C(Lang): pass class Python(Lang): def langinfo(self): print "hello %s!"%(self.name) lang1=C('C++','9.0') lang2=Python('Python','8.5') lang1.langinfo() lang2.langinfo()
运行结果:
5.多态
子类一定是父类的实例,父类不一定是子类的实例
#多态 class Lang(object): def __init__(self,name,score): self.name=name self.score=score def langinfo(self): print '%s:%s'%(self.name,self.score) class C(Lang): pass class Python(Lang): def langinfo(self): print "hello %s!"%(self.name) lang1=C('C++','9.0') lang2=Python('Python','8.5') lang3=Lang('Lang','10.0') print isinstance(lang1,C) print isinstance(lang1,Lang) print isinstance(lang3,C) print isinstance(lang3,Lang)
运行结果:
因为子类一定是父类的实例,因此可以将子类实例申明为父类类型
class Lang(object): def __init__(self,name,score): self.name=name self.score=score def langinfo(self): print '%s:%s'%(self.name,self.score) class C(Lang): pass class Python(Lang): def langinfo(self): print "hello %s!"%(self.name) def test(lang): lang.langinfo() lang1=C('C++','9.0') lang2=Python('Python','8.5') test(lang1) test(lang2)
运行结果:
调用langinfo时,会使用子类实例的方法,这就是多态的意义。