• python之路——面向对象(基础篇)


    面向对象编程:类,对象

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

    面向对象技术简介

    • 类(class):用来描述有相同属性和方法的对象的集合,它定义了集合中每个对象所共有的属性和方法。
    • 对象(object):类的实例

    创建类和对象

    1 class Person:
    2        
    3     def __init__(self,name,age):
    4         self.name = name
    5         self.age = age
    6 
    7     def talk(self,msg):
    8         print("%s-talk:%s"%(self.name,self.msg))
    9 obj = Person("alex","23")    
    • class 是关键字表示类,后边紧跟着类名"Person"
    • 创建对象obj = Person()->类名加括号(有参数,要传递构造方法的参数进去)
    • self是个什么东西呢?

    self:python自动传递的参数,代表你实例的对象。通过self可以调用该对象的相应属性和方法。

    • 构造方法:"__init__(self,name,age)";只要创建对象,就会自动去执行该方法然后我就可以用对象直接访问:obj.name &obj.age
    1 p_obj1 = Person("alex","23")
    2 p_obj2 = Person("lcy","24")
    3 print(p_obj1.name,p_obj1.age)# alex 23
    4 print(p_obj2.name,p_obj2.age)# lcy 24

    面向对象三大特性:封装、继承、多态

    封装
    • 将内容封装到类中
    • 在从类中调用封装的方法或属性

    Ex:

     1 class Person:
     2     
     3     def __init__(self,name,sex,age):
     4         self.name = name
     5         self.sex = sex
     6         self.age = age
     7     
     8     def show(self,obj):
     9         print(self.name,obj.name)
    10 
    11 
    12 obj_1 = Person("sb","male",23)
    13 obj_2 = Person("json","female",24)
    14 
    15 obj_1.show(obj_2) 
    16 '''
    17 打印:sb;json
    18 '''
    封装

    注:在类中可以封装任意类型的数据

    继承

    面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

    需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

    • 单继承
    • 多继承
    1. 单继承
     1 class A:
     2     
     3     def show(self):
     4         print("A:show")
     5 
     6     def aa(self):
     7         print("A:aa")
     8 
     9 class B(A):
    10     
    11     def show(self):
    12         print("B:show")
    13 
    14     def bb(self):
    15         print("B:bb")
    16 
    17 class C(B):
    18     
    19     def show(self):
    20         print("C:show")
    21 
    22     def cc(self):
    23         print("C:cc")
    24 
    25 obj_c = C()
    26 obj_c.show()  #优先调用自己的方法,如果自己没有,在去父类中找
    27 obj_c.bb()

    再看一个例子:

     1 class A:
     2 
     3     def __init__(self,name):
     4         self.name = name
     5 
     6     def show(self): 
     7         print(self.name)
     8 
     9 class B(A):
    10 
    11     def __init__(self,name):
    12         self.name = name
    13 
    14 obj_a = A("alex")
    15 obj_b = B("lcy")
    16 obj_b.show() # show 会打印谁 是 lcy 还是 alex

    想一想我们之前说过的self,这里是子类B对象obj_b调用父类A的show方法,那么self传递的肯定是obj_b 这个对象。所以打印的是obj_b.name = lcy;

      2. 多继承

    举一个简单多继承(python3)

     1 class C0:
     2     def  f2(self0):
     3         print("C0-f2")
     4 
     5 class C1(C0):
     6     def f1(self):
     7         print("C1-f1")
     8 
     9 class C2:
    10 
    11     def f2(self):
    12         print("C2-f2")
    13 class C3(C1,C2):
    14     def f3(self):
    15         print("C3-f2")
    16 
    17 obj = C3() 
    18 obj.f2()

    我们看obj 调用f2应该是谁的方法呢?

    按着继承顺序,寻找路径应该是C3->C1->C0->C2 (这个其中C2并不继承任何类)见图1

    注意:如果C2继承C0,那么寻找路径就编程了C3->C1->C2->C0 见图2

    图1

    图二

    在举一个看程序源码时候对象调用方法的一个执行顺序

     1 class C5:
     2     def forever(self):
     3         self.run()
     4 
     5     def run(self):
     6         print("C5-run")
     7 class C4(C5):
     8     def __init__(self):
     9         print("C4-init")
    10 
    11     def process(self):
    12         pass
    13 
    14     def run(self):
    15         print("C4-run")
    16         self.process()
    17 
    18 class C3(C4):
    19     def __init__(self):
    20         print("C3-init")
    21 
    22 class C2:
    23     def process(self):
    24         print("C2-process")
    25 
    26 class C1(C2,C3):
    27     pass
    28 
    29 obj = C1()
    30 obj.forever()
    31 '''
    32 C3-init
    33 C4-run
    34 C2-process
    35 '''

    顺序图:首先C1()调用构造,寻找init方法路径 C1->C2->C3(找到了)->C4->C5

    调用forever方法,寻找路径C1->C2->C3->C4->C5(找到了)

    forever又执行了 self.run方法 继续寻找:C1->C2->C3->C4(找到了)->C5

    run方法又执行了self.process()方法 继续寻找:C1->C2(找到了返回结果)->C3->C4->C5

         3. 多态

    python不支持多态。

    总结 

    • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
    • 类 是一个模板,模板中包装了多个“函数”供使用
    • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
    • 面向对象三大特性:封装、继承和多态

    最重要的图示:类和对象是在内存中如何保存

  • 相关阅读:
    Notebook ++ 设置护眼背景
    python 设置 excel 单元格颜色填充和字体效果
    python 设置 Excel 单元格边框线的各种风格
    python 对 excel sheet 的插入、复制、删除、重命名、设置标签颜色操作
    python 利用插入空行的方式制作工资条表格
    python 更新 openpyxl 到 3.0
    python 模拟 excel 宏、VBA 制作工资条表格
    Windows 系统
    python-pptx 实践 6.2:气泡图
    python-pptx 实践 6.1:添加五种基本图形(柱形图、折线图、饼图、条形图、散点图)
  • 原文地址:https://www.cnblogs.com/lcysen/p/6082293.html
Copyright © 2020-2023  润新知