面向对象,魔术方法

面向对象

一面向对象

  1. 什么是面向对象:
    一种认识世界、分析世界的方法论。将万事万物抽象为类。
  2. 类class:
    类是抽象的概念,是万事万物的抽象,是一类事物的共同集合的集合。
    用计算机语言来描述类,就是属性和方法的集合。
  3. 对象instance,object:
    对象是类的具象,是一个实体。
    每个个体都是抽象类的不同实体。
  4. 哲学
    一切皆对象
    对象是数据和操作的封装
    对象是独立的,但是对象之间可以相互作用
    目前OOP(面向对象编程)是最接近人类认知的编程范式
  5. 面向对象三要素
    1. 封装
      组装:将数据和操作封装在一起
      隐藏数据:对外只保留一些接口通过接口访问对象
    2. 继承
      多复用,继承来的就不用自己写了
      多继承少修改,OCP(Open-closed Princeple),使用继承来改变,来体现个性
    3. 面向对象变成最灵活的地方,动态绑定

6.实例化
实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法
总结

类变量所有实例共享,实例自己的类无法访问
实例可以动态增加属性。实例,__dict__[变量名]或实例, [变量名]访问
实例属性查找顺序,自己的__dict__,如果没有就通过__class__找到自己的类然后去类的__dict__

7.装饰一个类

8.猴子补丁(Monke Patch)
在运行时,对属性、方法、函数等进行动态替换。

其目的是为了通过替换、修改来增强、扩展原代码的能力。

黑魔法,慎用。

 

 

9.属性装饰器

好的设计是:把实例属性保护起来,不让外部直接访问,外部使用getter和setter读取和修改属性。

特别注意:使用property装饰器的时候三个方法同名

10方法重载

python没有重载或者说python本身就实现了其他语言的重载。

11封装

将数据和操作组织到类中,即属性和方法

将数据隐藏起来,给使用者提供操作(方法)。使用者通过操作就可以获取或者修改数据。

getter和setter

通过访问控制,暴露适当的数据和操作给用户。该隐藏的隐藏起来,例如保护成员和私有成员。
二,类的继承

继承

继承是让子类从父类获取特征(属性和方法)

父类:又称基类或超类

子类:也成派生类

总结:

继承时,共有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不能直接访问,私有变量所在的类内的方法可以直接访问这个私有变量。

Python通过自己的一套实现,实现了和其他语言一样的面向对象的继承机制。

属性查找顺序

实例的__dict__ >类__dict__如果有继承 >父类__dict__、

如果都没有找到就会抛异常,否则先找到就立即返回。

1.方法的重写,覆盖override

如果类B声明继承自类A,则类B的__bases__中可以看到类A。

但是这和是否调用类A的构造方法是两回事。

如果B调用A的构造方法,就可以拥有父类的属性了。

注意:调用父类的init方法,出现在不同的位置,可能导致不同结果。

故调用时一般把调用父类的放在最前(使用super().__init__调用)

特别注意:

一个原则,自己的私有属性,就该自己的方法读取和修改,不要借助其他类的方法,即使是父类或派生类的方法(因为私有属性的改名极其容易弄混)

三,多继承

Python2为了兼容分为旧式类和新式类

Python3全是新式类

新式类继承自object,可以使用super。

多继承

OCP原则:多用“继承”、少修改。

继承的用途:增强基类、实现多态

多态

在面向对象中,父类、子类通过继承联系在一起,如果通过一套方法,就可以实现不同的表现,就是多态。

一个类继承自多个类就是多继承,它将具有多个类的特征。

多继承弊端

多继承的实现会使编译器设计的复杂度增加,现在很多语言舍弃了类的多继承。

多继承可能带来二义性。

解决方案:要解决二义性,深度优先或者广度优先。

Python的多继承实现

注意:应该尽量避免使用多继承。

  1. Mixin

Mixin类

Mixin本质就是多继承的实现。

Mixin体现的是一种组合的设计模式。

在面向对象的设计中,一个复杂的类,往往需要很多功能,而这些功能又来自不同的类,这就需要很多类组合在一起。

从设计角度来说,多组合,少继承。

Mixin类使用原则

Mixin类不应显示出现init的初始方法

通常不能独立工作,因为它是准备混入别的类中的部分功能

Mixin类的祖先类也应该是Mixin类

注意:使用时,Mixin类通常在类继承的第一个位置

Mixin类和装饰器使用看个人喜好。但是如果需要继承就要使用Minxin类的方式了。

魔术方法

特殊属性

查看属性

  1. 魔术方法分类:
    1. 创建、初始化和销毁
    2. hash
    3. bool
    4. 可视化
    5. 运算符重载
    6. 容器和大小
    7. 可调用对象
    8. 上下文管理
    9. 反射
    10. 描述器
    11. 其他杂项

hash相等只是hash冲突,不能说明两个对象相等。

一般来说提供hash方法是为了作为set或者dict的可以,所以去重还要同时提供eq方法。

运算符重载应用场景

往往是用面向对象实现的类,需要大量的运算,而运算符是这种运算在数学上最常见的表达方式。

提供运算符重载,比直接提供加法方法更适合该领域的使用者习惯。

python提供了

这个装饰器可能带来性能问题。所以不如自己实现。

实现方法很简单除了eq方法必须有之外,lt,gt有其一和le,ge有其一就能实现和装饰器一样的功能。

上下文管理

上下文管理的安全性:安全。

就算是退出了python解释器依旧能够执行exit函数说明上下文管理很安全。

  1. 上下文应用场景
    1. 增强功能:
      在代码执行的前后增加代码,增强功能。类似装饰器的功能。
    2. 资源管理:
      打开的资源需要关闭
    3. 权限验证:
      在代码执行之前,做权限验证,在enter方法中处理。

反射

运行时,区别于编译时,指的是程序被加载到内存中执行的时候。

反射,reflectio,指的是运行时获取类型定义信息。

一个对象能在运行时,像照镜子一样,反射出他的类型信息。

简单说,在python中,能够通过一个对象,找出其type,、class、attri或method的能力,称为反射或者自省。

具有反射能力的函数有:type()、isinstance()、callable()、dir()、getattr()

1.python提供了内置的函数

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98476

(1)
上一篇 2018-05-14 08:55
下一篇 2018-05-14 09:24

相关推荐

  • 函数与生成器

    函数 由若干语句组成的语句块,函数名,参数列表构成,是组织代码的最小单元,完成一定的功能,结构化编程对代码的最基本的封装,封装的目的是为了复用 函数中没有return,隐式会返回一个none值 定义中的参数列表成为形式参数,只是一种形式表达,简称形参 调用时写的参数是实际参数,是实实在在传入的值,简称实参 函数的定义,只是声明了参数,不会执行,可以进行调用,…

    2018-04-16
  • 树 非线性结构,每个元素都可以有多个前驱和后继 树是n(n>=0)个元素 n = 0时,称为空树 树只有一个特殊的没有前驱的元素,称为树的根root 树中除了根结点,其余元素只能有一个前驱,可以有0个或者多个后继 递归定义 树T是n(n>=0)个元素的集合,n=0时,称为空树 有且只有一个特殊元素根,剩余元素都可以被划分为m个互不相交的集合T1,…

    2018-04-16
  • Python 部分知识点总结(六)

    此篇博客只是记录第八周未掌握或不熟悉的知识点,用来加深印象。

    Python笔记 2018-05-02
  • 日志分析项目

    日志分析

    2018-05-07
  • 元组与字符串

    元组tuple 一个有序的元素组成的集合,不可变,用()表示,可进行索引,正索引:从左至右,从0开始;负索引:从右至左,从-1开始,正负索引不可超界,否则引发indexerror,tuple[index],index就是索引,使用中括号访问 元组是只读的,所以没有增,改,删的方法 冒泡法:属于交换排序,两两比较大小,交换位置,结果分为升序和降序排列 升序:n…

    Python笔记 2018-04-01
  • Linux介绍

    Linux介绍 Linux概述 Linux概述 Linux内核由芬兰人Linus Torvalds 1991年根据386架构开发。Linux是系统的内核并非系统,之后的RED HALT 、Centos等都是以Linux为内核的类UNIX操作系统。 1969年UNIX系统由THOMPSON和D.M.Riche在美国贝尔实验室开发 1990年芬兰人Linus T…

    Python笔记 2018-03-26