第十四篇 面向对象三大特性

首先面向对象并不是所有情况都适用的

小例子

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class pyrene:
    def fet(self,back):
        print(back,self)

obj = pyrene()
obj.fet("a")
View Code

一、面向对象

上面的执行顺序:

1)首先创建对象 obj = pyrene()

2)执行方法 obj.fet("a")

这里的对象叫做类对象指针

下面是类对象指针形象图

self、是形式参数,在python内部传递(self就相当于类创建的对象)

二、面向对象--封装

封装解读:

首先让数据封装到对象里面,然后调用构造方法

来看代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class pyrene:
    def __init__(self,bk):
        """
        构造方法
        :param bk:
        """
        self.backend = bk#普通字段,保存在对象里面
    def fetch(self):
        print(self.backend)
    def add_record(self):
        print(self.backend)
#创建对象,实例,并且将数据封装到对象中
obj1 = pyrene("hello")
obj1.add_record()
View Code

执行obj1 = pyrene("hello"),其实是执行了如下步骤

1、首先把数据封装到obj1中

2、执行构造方法__init__

三、面向对象--继承

猫属于动物,这里就可以说猫是动物的子类(派生类),动物是猫的父类(基类)

注意点:

1、基类和派生类都有相同的方法的时候会执行子类的方法

2、派生类可以有多个基类     执行顺序:广度优先(python2.7的经典类执行顺序是:深度优先)

看下面例子:

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class a():
    def f2(self):
        print("a")
class b():
    def f1(self):
        print("B")
class c(a):
    def C(self):
        print("c")
class d(b):
    def D(self):
        print("D")
class e(c,d):
    def E(self):
        print("E")
obj = e()
obj.f1()

 

可以看到e继承c和d。这里是执行f1方法执行顺序如下:

首先会去继承的c类中寻找,c类中没有f1方法,之后去a中寻找,a中没有,接着去d类中寻找没有,接着去b类中终于找到了f1方法

再看下面

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class A(object):
    def f1(self):
        print("A")
class a(A):
    def f2(self):
        print("a")
class b(A):
    def f2(self):
        print("B")
class c(a):
    def C(self):
        print("c")
class d(b):
    def D(self):
        print("D")
class e(c,d):
    def E(self):
        print("E")
obj = e()
obj.f1()
View Code

这里和上面区别在于a和b共同继承一个A类,这个时候的执行顺序:

首先会去继承的c类中寻找,c类中没有f1方法,之后去a中寻找,a中没有,接着去d类中寻找没有,接着去b类中再去A类中找

三、面向对象---多态

python本身就支持多态

什么是多态看下面代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Foo:
    def a(self):
        print("Foo")
class Bar:
    def a(self):
        print("Bar")
def func(arg):
    arg.a()
func(Foo())
多态

这里的args既可以是Foo的对象,也可以是Bar的对象然后执行其方法,这就是多态

 

posted @ 2017-02-19 00:30  pi-pi-miao-miao  阅读(182)  评论(0编辑  收藏  举报