python扫盲之五-面向对象编程

python扫盲之五-面向对象编程

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

是不是看起来不太容易理解?简单来说,把一个程序想象成一台车。造一辆车需要车轮,发动机,外壳等等东西,抽象一下,程序中一段程序可以反复用的可以包裹成函数,我们不用关心函数里面的处理逻辑,只要返回的结果是我们想要的就行了。好返回来,面向对象编程,就是先把车轮,发动机做好了 放在那里,然后需要的时候拿过来。用程序来说就是,编程一个对象,包裹在class里,用的时候 实例化一下这个对象。


还是比较复杂对吧,咱们看个小例子

class abc(object): def __init__(self, name): self.name = name def print_score(self): print '%s' % (self.name)

上面这个类 功能就是输出你传进去的参数

#首先要实例化类hello = abc(name='weixiansen')hello.print_score() #没毛病

其实使用起来和函数还是非常类似的,只是概念有些抽象。不过这只是个开始而已。

下面我们说说函数不行但是类行的功能。

访问限制

还是上面的例子,初始化类的时候,我们传入name的值,同时实例化后变成self.name ,那么这个self.name其实是可以被类外部直接访问的,例如

class abc(object): def __init__(self, name): self.name = name def print_score(self): print '%s' % (self.name)hello = abc(name='test')print hello.name #看到没,直接调用就能看见了

但现实情况中,我们大多数时候是不希望让人通过这种探测获取到类里面的一些数据,进而分析出里面的处理逻辑的。所以我们需要把一些敏感变量,或def进行限制访问,方法也很简单,就是在前面加上__(两个下划线)。看例子

class abc(object): def __init__(self, name): self.__name = name def print_score(self): print '%s' % (self.__name)hello = abc(name='weixiansen')print hello.__name>>Traceback (most recent call last): File "E:/PycharmProjects/untitled8/a.py", line 13, in  print hello.__nameAttributeError: 'abc' object has no attribute '__name'#获取就报错了#但如果通过正常的调用访问呢?class abc(object): def __init__(self, name): self.__name = name def print_score(self): print '%s' % (self.__name)hello = abc(name='weixiansen')hello.print_score()>>weixiansen#没毛病!

同样内部的函数也可以通过这种方式进行访问限制,例子

class abc(object): def __init__(self, name): self.__name = name def __print_score(self): print '%s' % (self.__name)hello = abc(name='test')hello.__print_score()>>Traceback (most recent call last): File "E:/PycharmProjects/untitled8/a.py", line 13, in  hello.__print_score()AttributeError: 'abc' object has no attribute '__print_score'#这种函数只能在类的内部进行调用

类的继承

这种大招绝对是函数式编程无法比拟的。所谓类的继承,就是父亲和儿子的关系(或者父亲,儿子,孙子。。。)。父亲(父类)定义的功能,儿子(子类)可以直接使用。或者重新定义父类的功能。看下面的例子:

class abc(object): def __init__(self,): pass def print_score(self): print 'father'class Def(abc): def print2(self): print 'son'zz = Def()zz.print_score()zz.print2()>>fatherson

上面这个例子里面 子类Def 并没有设置print_score方法吧,但是依然可以用,就是调用的父类的方法。当然儿子继承了父亲的遗产后,也可以自行支配嘛。重写父类的方法。例子

class abc(object): def __init__(self,): pass def print_score(self): print 'father'class Def(abc): def print_score(self): print 'son1' def print2(self): print 'son2'zz = Def()zz.print_score()zz.print2()>>son1son2#看这个例子就是父类的方法被子类重写了。。后浪推前浪啊!


分享到:


相關文章: