Python 面向对象学习

面向过程  与 面向对象

编程范式

编程范式是指 用特定的语法+数据结构+算法组成的代码告诉计算机如何执行任务的过程

两种最重要的编程范式分别为  面向过程编程(PP)  和  面向对象 编程(OOP)

面向过程编程

例子  数据库备份   分三步,连接数据库, 备份数据库,测试备份文件可用性

def db_conn():
        连接数据库

def db_backup(db,name):
        导出数据库
        备份打包 转移目录

def  db_backup_test():
        测试是否备份成功


if __name__ == '__main__':
    db_conn()
    db_backup(数据库)
    db_backup_test()

明显缺点:耦合性太高不易于迭代与维护

 

面向对象编程

OOP编程时  利用 类 和 对象 来创建模型 对 真实世界进行描述

核心特性:

Class 类

类 就是 对一类有相同属性的对象 抽象,蓝图,原型

Object   对象

对象 即为   类 实例化后的实例   一个类必须经过 实例化 才能在程序中调用,  一个类可以实例化多个对象,每个对象有不用的属性  (人有指纹 而指纹都不相同)

Encapsulation   封装

类 对 数据的复制,内部调用 对 外部用户都是透明的  这使类 变成一个容器,  里面包含类的数据和方法

Inheritance  继承

一个类 可以派生出子类 在这个父类里定义的属性 ,方法 自动被子类继承

Polymorphism  多态

多态时 面向对象重要的特性    指一个基类 派生出了不同的子类, 每个子类都继承了同样的方法名的同时又对父类的方法做出了不同的实现

面向对象编程(OOP)  

无论用什么范式来编程  都要明确以下原则:

  1. 写重复代码 非常低级

  2. 写过的代码要经常变动

函数式编程与 OOP的主要区别是  程序更加具有扩展性和易更改

类的基本定义

class Role(object):# 定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法
        def __init__(self,name,money=16000):  # 初始化函数
                   self.name= name
                   self.money = money

上面这个额  __init__()叫做构造方法,在类被调用时,这个方法会自动执行,进行初始化动作  

其中的 self   举例 

r1 = Role('poet',money=8000)  #此时 self  相当于r1,     Role(r1,'poet',money=8000

在执行上面r1 = Role('poet',money=8000)时  python解释器工作流程:

  1. 在内存中开辟一块空间 指向 r1这个变量名

  2. 调用  Role这个类 并 执行 __init__() 方法  等价于  Role.__init__(r1,'poet',money=8000)

这样  self.name 就是为了 将值 存入 实例化的的内存空间中

面向对象的2.5大特性

一  封装    

封装的本质是 明确内外

面向对象封装的两大特性:

1 将内容封装  (r1 = Role('poet',money=8000) )

python 约定私有是人去识别约定   而不是其他语言的强制不能调用

 

class Role(object):
        _id = 666
        __id2 = 777  # 自动重命名   _Role__sta
    def __init__(self,name,money=16000): # 初始化函数 
      self.name= name
      self.money
= money
      self.id = __id2 # 这样也就区分了内外
r1 = Role('poet',money=8000)
print(Role.__dirt__)
r1._id # 约定私有是人去识别约定
r1._Role__star # 藏的 更深了 直接自动重命名

 

 

 

  1单下划线

    只要属性是  单 下划线开头 就是一个被隐藏起来的属性 _id = 666

  2 双下划线

    __id = 666

    

 

2 调用封装的内容形式分为两种:

  通过对象直接调用

class FOO:
    def __init__(self,name,age):
        self.name = name
        self.age = age

obj1 = Foo('poet', 18)
print(obj1.name)  直接调用 obj1对象的name属性

  通过self简介调用被封装的内容

  

class FOO:
    def __init__(self,name,age):
        self.name = name
        self.age = age
   def detail():
     print(self.name) obj1
= Foo('poet', 18)
obj1.detail() # python会默认将 self 传值 即 obj1.detail(obj1)

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

二 继承

  继承  就是 改变 和 扩展

  所以面向对象的继承来说 其实就是 将多个类共有的方法 提取到 父类中, 子类仅需要 继承父类而不必 一一实现方法

  注:  派生类 和 基类 都是 继承 中 子类和 父类的不同叫法而已

  

    多继承:

        1.在python中可以 继承多个类,  Java C# 只能继承一个类

        2. Python继承多个类时遵循两种 找寻方式    深度优先广度优先

新式类  广度优先

class N1(object):
    pass

class N2(N1):
    pass

经典类  深度优先

class C1:
        pass
class  C2(C1):
        pass

0.5 多态

  多态实际上是依附于继承的两种含义    "改变" 和"扩展"  本身意味着必须有机制去自动选用你改变/扩展过的版本

 

 

一般情况下python开发中, 全部使用 面向对象 或  面向对象和函数式混用

掌握面向对象 设计利器 :    领域建模  领域建模 领域建模

  1. 发觉重要的业务领域概念

  2. 建立业务领域概念之间的关系

 

posted @ 2018-01-30 09:07  poetL  阅读(191)  评论(0编辑  收藏  举报