zoukankan      html  css  js  c++  java
  • 第十四篇 面向对象三大特性

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

    小例子

    #!/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的对象然后执行其方法,这就是多态

  • 相关阅读:
    HDU 1203 【01背包/小数/概率DP】
    HDU 2955 【01背包/小数/概率DP】
    2018 计蒜之道 初赛 第三场
    判断一个多边形是顺时针还是逆时针的方法
    牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】
    Codeforces Round #311 (Div. 2)
    暑期训练狂刷系列——Hdu 3506 Largest Rectangle in a Histogram (单调栈)
    暑期训练狂刷系列——poj 3468 A Simple Problem with Integers (线段树+区间更新)
    暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)
    暑期训练狂刷系列——poj 3264 Balanced Lineup(线段树)
  • 原文地址:https://www.cnblogs.com/pyrene/p/6414618.html
Copyright © 2011-2022 走看看