第十四篇 面向对象三大特性
首先面向对象并不是所有情况都适用的
小例子
#!/usr/bin/env python # -*- coding:utf-8 -*- class pyrene: def fet(self,back): print(back,self) obj = pyrene() obj.fet("a")
一、面向对象
上面的执行顺序:
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()
执行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()
这里和上面区别在于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的对象然后执行其方法,这就是多态