• python之旅六【第七篇】面向对象


    面向对象三大特性

    • 面向过程:根据业务逻辑从上到下写垒代码
    • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
    • 面向对象:对函数进行分类和封装,让开发“更快更好更强...

    面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

      类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

      对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

    一、什么是类&对象

    类:可以理解为他是一个模板,比如人们在说“人”这个名词的时候,没人知道这个“人”具体是指那个人!

    对象:对象是一个实际的物体,他有自己的属性和特征、行为的,比如alex和eric,当说到这两个人的时候就会想到,alex很猥琐、eric很闷骚他们的特征、动作啊都能具体的显示出来!

    二特性

    封装
    继承
    多态(很少有用)

    创建类和对象

     类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

     对象则是根据模板创建的实例,通过实例对象可以执

    行类中的函数

    • class是关键字,表示类
    • 创建对象,类名称后加括号即可
    • 类中的函数第一个参数必须是self
    •  类中定义的函数叫做 “方法”

    封装

    封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

    所以,在使用面向对象的封装特性时,需要:

    • 将内容封装到某处
    • 从某处调用被封装的内容

    第一步:将内容封装到某处

    self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                                  当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

    所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

    第二步:从某处调用被封装的内容

    调用被封装的内容时,有两种情况:

    • 通过对象直接调用
    • 通过self间接调用

    1、通过对象直接调用被封装的内容

    上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名

     1 class Foo:
     2  
     3     def __init__(self, name, age):
     4         self.name = name
     5         self.age = age
     6  
     7 obj1 = Foo('wupeiqi', 18)
     8 print obj1.name    # 直接调用obj1对象的name属性
     9 print obj1.age     # 直接调用obj1对象的age属性
    10  
    11 obj2 = Foo('alex', 73)
    12 print obj2.name    # 直接调用obj2对象的name属性
    13 print obj2.age     # 直接调用obj2对象的age属性
    View Code

    2、通过self间接调用被封装的内容

    执行类中的方法时,需要通过self间接调用被封装的内容

     1 class Foo:
     2   
     3     def __init__(self, name, age):
     4         self.name = name
     5         self.age = age
     6   
     7     def detail(self):
     8         print self.name
     9         print self.age
    10   
    11 obj1 = Foo('wupeiqi', 18)
    12 obj1.detail()  # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
    13   
    14 obj2 = Foo('alex', 73)
    15 obj2.detail()  # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
    View Code

    综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

    调用过程

     继承

    继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

     简单的继承例子

    class F:
        def f1(self):
            pass
    
    class S(F):  #继承
        def f2(self):
            pass
    obj = S()
    obj.f2()
    obj.f1()  #可以执行了

    上面的例子就是S类继承了F类,然后S类具有了F类的属性,这样就可以执行了。

    基类和派生类

    上面的例子中F就是基类,S就是派生类

    新式类与经典类

    python3.x以后默认都是新式类了,所有我们使用新式类。

    上面的截图!有(object)就是新式类,有什么区别!新式类,有些修改和新增了一些功能,以后建议使用“新式类”

    这里需要提的一点是在多继承的时候的问题:

    不管是直接、或间接的继承新式类,那么你的类也是新式类!

    python支持多继承的,其他语言一般不支持的

    当类是经典类时,多继承情况下,会按照深度优先,纵向优先方式查找
    当类是新式类时,多继承情况下,会按照广度优先,横向优先方式查找

    经典类

    最后结果是A.f1

    新式类

    结果B.f1  

    注意只有上面这种情况属于新式类的广度优先

     总结一下:

    以上就是本节对于面向对象初级知识的介绍,总结如下:

    • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
    • 类 是一个模板,模板中包装了多个“函数”供使用
    • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
    • 面向对象三大特性:封装、继承和多态
  • 相关阅读:
    pfofinet和S7
    A1010 Radix [二分/******]
    A1005 Spell It Right
    最大回文子串长度 [dp]
    HDU 1159 Common Subsequence [最长公共子序列]
    1045 Favorite Color Stripe [动态规划/最长不下降子序列]
    1007 Maximum Subsequence Sum [动态规划]
    数塔问题(递归/递推)
    hdu 畅通工程 [Kruskal/Prime]
    1087 All Roads Lead to Rome [dj]
  • 原文地址:https://www.cnblogs.com/Dicky-Zhang/p/7498151.html
Copyright © 2020-2023  润新知