继承

  1. 什么是继承?
  1. 继承是一种新建类的方式,新建的类称为子类或派生类
    父类又称为基类、超类
  2.  
  3. 子类可以“遗传”父类的属性,从而可以减少代码冗余
  4.  
  5. 如何寻找继承关系?
    先抽象,再继承,继承描述的就是
    一种父子关系 / 从属关系
  6.  
  7. 继承的语法
  8.  
  9. class Foo1:
    pass
  10.  
  11. class Foo2:
    pass
  12.  
  13. class Bar(Foo1, Foo2):
    pass
  14.  
  15. class Bar: # 在python3中没有继承任何类的类,默认继承object
    pass

新式类与经典类

  1. 新式类与经典类:
  2.  
  3. 新式类:继承object类的子类,以及该子类的子类。。。
    python3中全都是新式类
  4.  
  5. 经典类:没有继承object的子类,以及该子类的子类。。。
    只有在python2中才有经典类,在python2中没有继承任何类的子类不会
    默认继承object
    class Foo(object):
    pass
  6.  
  7. 经典类与新式类的区别:在菱形继承上
    经典类:深度优先查找
    新式类:广度优先查找
    Foo.mro()
  8.  
  9. 在子类定义的方法中重用父类的功能:
    方式一:与继承无关
    指定道姓地调用某一个类的函数:
    类名.函数名(对象,参数1,参数2,...)
  10.  
  11. 方式二:严格依赖继承
    super(自己的类名,self).绑定方法(参数1,参数2,。。。)

继承顺序

  1. class A(object):
  2. def test(self):
  3. print('from A')
  4.  
  5. class B(A):
  6. def test(self):
  7. print('from B')
  8.  
  9. class C(A):
  10. def test(self):
  11. print('from C')
  12.  
  13. class D(B):
  14. def test(self):
  15. print('from D')
  16.  
  17. class E(C):
  18. def test(self):
  19. print('from E')
  20.  
  21. class F(D,E):
  22. # def test(self):
  23. # print('from F')
  24. pass
  25. f1=F()
  26. f1.test()
  27. print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
  28.  
  29. #新式类继承顺序:F->D->B->E->C->A
  30. #经典类继承顺序:F->D->B->A->E->C
  31. #python3中统一都是新式类
  32. #pyhon2中才分新式类与经典类

如何查找继承关系

  1. 先抽象
  2. 抽象对象之间相似之处得到了类
  3. 再总结类与类之间的相似得到父类
  4. 再继承
  5. 子类继承父类,子类可以遗传父类的属性

属性查找

  1. obj.x
  2. 1、先从obj.__dict__
  3. 2、对象的类.__dict__
  4. 3、父类.__dict__
  5. ..........

派生

  1. 子类定义的名字会覆盖父类的同名属性
  2. class Parent:
  3. x = 1
  4.  
  5. def f1(self):
  6. print('from parent')
  7.  
  8. class Sub(Parent):
  9. z = 3
  10.  
  11. def f1(self):
  12. # Parent.f1(self)
  13. super(Sub, self).f1() # super会检索Sub.mro()
  14. print('from sub')

组合

  1. 作用:
  2. 组合与继承的作用一样,都是用来减少类与类之间的重复代码
  3.  
  4. 定义:
  5. A类的对象具备某一个属性,该属性的值是B类的对象
  6. 基于这种方式就把A类与B类组合到一起
  7. 对象既能使用A类中的数据与功能,也能使用B类中的数据与功能

封装

  1.  
  1. 什么是封装?
  2.  
  3. 封装(从字面意思理解)就是隐藏,隐藏指的是在类内部将一个属性藏起来
    让类外部的使用者无法直接用到。在py中就是用__开头将一个属性藏起来.
  4.  
  5. 补充说明:封装绝对不是单纯意义的隐藏
    需知定义属性的目的就是为了让使用者去用,使用者要想使用类内部隐藏的属性
    需要类的设计者在类内部开一个接口(定义一个方法),在该方法内访问隐藏的属性
    ,使用者以后就通过该方法来“间接地”访问内部隐藏的属性
    作为类的设计者可以在接口之上附加任意逻辑从而严格控制类的使用者对属性的操作
  6.  
  7. class People:
    def __init__(self, name):
    self.__name = name
  8.  
  9. def tell_name(self):
    # 添加逻辑
    return self.__name
  10.  
  11. obj = People('egon')
    # obj.__name
    obj.tell_name()
  12.  
  13. 封装函数属性: 隔离复杂度
  14.  
  15. class ATM:
    def __card(self):
    print('插卡')
  16.  
  17. def __auth(self):
    print('用户认证')
  18.  
  19. def __input(self):
    print('输入取款金额')
  20.  
  21. def __print_bill(self):
    print('打印账单')
  22.  
  23. def __take_money(self):
    print('取款')
  24.  
  25. def withdraw(self):
    self.__card()
    self.__auth()
    self.__input()
    self.__print_bill()
    self.__take_money()

封装之property

  1. 用来将类内的函数伪装成一个数据属性
  1. class Foo:
  2. @property
  3. def name(self):
  4. pass
  5. @name.setter
  6. def name(self,value):
  7. pass
  8. @name.deleter
  9. def name(self):
  10. pass
  11. obj=Foo()
  12. obj.name
  1. '''
  2. BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
  3.  
  4. 成人的BMI数值:
  5. 过轻:低于18.5
  6. 正常:18.5-23.9
  7. 过重:24-27
  8. 肥胖:28-32
  9. 非常肥胖, 高于32
  10.   体质指数(BMI)=体重(kg)÷身高^2(m)
  11.   EX:70kg÷(1.75×1.75)=22.86
  12.  
  13. '''
  14.  
  15. class People:
  16. def __init__(self, name, weight, height):
  17. self.name = name
  18. self.weight = weight
  19. self.height = height
  20.  
  21. @property
  22. def bmi(self):
  23. return self.weight / (self.height * self.height)
  24.  
  25. carter = People('carter', 60, 1.75)
  26.  
  27. # print(carter.bmi())
  28.  
  29. print(carter.bmi)
  30.  
  31. # 属性修改
  32.  
  33. class People:
  34. def __init__(self, name):
  35. self.__name = name
  36.  
  37. @property
  38. def name(self):
  39. print('您现在访问的是用户名...')
  40. return self.__name
  41.  
  42. @name.setter # 修改
  43. def name(self, x):
  44. print('已修改')
  45. self.__name =x
  46.  
  47. @name.deleter # 删除
  48. def name(self):
  49. print('已删除')
  50. del self.__name
  51.  
  52. obj = People('carter')
  53.  
  54. obj.name = 'QX'
  55. print(obj.name)
  56. # del obj.name
  57. # print(obj.name)

BMI指数

classmethod与staticmethod区别

  1. classmethod:
      将类中的一个函数绑定给类

    staticmethod:
      将类中的一个函数解除绑定
  1. '''
  2. 1 绑定方法:
  3. 在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法
  4. 绑定对象的方法特殊之处:
  5. 应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入
  6.  
  7. 绑定到类的方法特殊之处:
  8. 应该由类来调用,类来调用,会自动将类当作第一个参数传入
  9.  
  10. '''
  11. import settings
  12.  
  13. class People:
  14. def __init__(self, name, age, sex):
  15. self.name = name
  16. self.age = age
  17. self.sex = sex
  18.  
  19. def tell(self):
  20. print('姓名: %s\n年龄: %s\n性别: %s' % (self.name, self.age,self.sex))
  21.  
  22. @classmethod
  23. def from_conf(cls):
  24. return cls(settings.NAME, settings.AGE, settings.SEX)
  25.  
  26. p1 = People('carter', 20, 'male')
  27. p1.tell()
  28.  
  29. p2 = People(settings.NAME, settings.AGE, settings.SEX)
  30. p2.tell()
  31.  
  32. p3 = People.from_conf()
  33. p3.tell()
  34.  
  35. '''
  36. 2. staticmethod:非绑定方法,就是一个普通函数
  37. 特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用
  38. 谁来用都是一个普通函数,也就是说没有自动传值的特性了
  39.  
  40. '''
  41.  
  42. import settings
  43. import hashlib
  44. import time
  45.  
  46. class People:
  47. def __init__(self, name, age, sex):
  48. self.uid = self.create_id()
  49. self.name = name
  50. self.age = age
  51. self.sex = sex
  52.  
  53. def tell(self):
  54. print('ID: %s\n姓名: %s\n年龄: %s\n性别: %s' % (self.uid, self.name, self.age,self.sex))
  55.  
  56. @classmethod
  57. def from_conf(cls):
  58. return cls(settings.NAME, settings.AGE, settings.SEX)
  59.  
  60. @staticmethod
  61. def create_id():
  62. m = hashlib.md5()
  63. m.update(str(time.perf_counter()).encode('UTF-8'))
  64. return m.hexdigest()
  65.  
  66. obj = People('carter', 18, 'male')
  67. # print(obj.uid, obj.name, obj.age, obj.sex)
  68. obj.tell()
  69.  
  70. print(obj.create_id())
  71. print(People.create_id())

多态与多态性

  1. 多态:
  2. 同一种事物有多种形态
  3. 在程序中用继承可以表现出多态
  4.  
  5. 多态性:
  6. 可以在不考虑对象具体的类的情况下直接参考基类的标准使用对象
  7.  
  8. 鸭子类型:
  9.  
  10. class Disk:
  11. def read(self):
  12. print('disk read')
  13.  
  14. def write(self):
  15. print('disk write')
  16.  
  17. class Txt:
  18. def read(self):
  19. print('txt read')
  20.  
  21. def write(self):
  22. print('txt write')
  23.  
  24. class Process:
  25. def read(self):
  26. print('process read')
  27.  
  28. def write(self):
  29. print('process write')
  30.  
  31. obj1=Disk()
  32. obj2=Txt()
  33. obj3=Process()
  34.  
  35. obj1.read()
  36. obj2.read()
  37. obj3.read()

python_面向对象笔记的更多相关文章

  1. JS面向对象笔记二

    菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...

  2. PHP面向对象笔记解析

    PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...

  3. Python_爬虫笔记_2018.3.19

    Python_爬虫_笔记 1.前言 1.1爬虫用途: 网站采集.接口采集(地图(jis 热力学 屋里端口/协议).微信.知乎.) 1.2基本流程:网页下载(requests)+网页解析+爬虫调度 网页 ...

  4. Python 面向对象笔记

    Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...

  5. python_面向对象编程

    一.编程范式 程序员通过特定的语法+数据结构+算法告诉计算机如果执行任务,实现这个过程有不同的编程方式,对这些不同的编程方式进行归纳总结得出来的编程方式类别,即为编程范式 编程范式:面向过程编程.面向 ...

  6. js面向对象笔记

    JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...

  7. python 面向对象-笔记

    1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...

  8. [52PJ] Java面向对象笔记(转自52 1510988116)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

  9. python_面向对象

    什么是面向对象? -- 一种主流编程范式,编程思维框架,世界主流两个方向,面向对象和面向过程. --  面向是把关注点集中一个具体东西,比如看向手机,也叫面向手机,手机就是一个对象,我们 把手机的属性 ...

随机推荐

  1. .net mvc中一种简单的工作流的设计

    开篇前的废话:工作流是我们在做互联网应用开发时经常需要用到的一种技术,复杂的工作流我们基本是借助一些开源的 工作流项目来做,比如 ccflow等,但是有时候,我们只需要实现一些简单的工作流流程,这时候 ...

  2. 改变UITabbar顶部分割线颜色

    项目中是使用UITabbarController 因此改变UITabbar的分割线代码如下 由于美术没提供图片,所以自己创建了个图片 //改变tabbar 线条颜色 CGRect rect = CGR ...

  3. HBuilder mui 报错No 'Access-Control-Allow-Origin' header

    Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' he ...

  4. UWP 剪贴板

    一:剪贴板 一般的复制,用户自己光标选中文本,crtl +c复制就可以了.但是有时候也需求有一个复制的按钮,当用户点击复制按钮,就可以把当前的某些内容复制到剪贴板里. 这里就用到了DataPackag ...

  5. Hdu 4725 The Shortest Path in Nya Graph (spfa)

    题目链接: Hdu 4725 The Shortest Path in Nya Graph 题目描述: 有n个点,m条边,每经过路i需要wi元.并且每一个点都有自己所在的层.一个点都乡里的层需要花费c ...

  6. 树状数组 POJ 2481 Cows

    题目传送门 #include <cstdio> #include <cstring> #include <algorithm> using namespace st ...

  7. System.Web.Mvc 和 using System.Net.Http 的 Filter

    在尝试给webapi增加 ExceptionFilter时,出现了错误,经查询区别如下: System.Web.Mvc.Filters 是给mvc用的 System.Web.Http.Filters ...

  8. 初探Hibernate3源码--读取配置文件

    依照个人推测,要实现ORM框架,关键是如何拼凑sql语句再通过jdbc来进行对数据库的访问,另外将数据库返回的数据记录封装成对应的类也是必不可少的. 那么实现ORM框架的基本思路如下: 1,读取xml ...

  9. eclipse 闪退原因

    电脑关机后 重启发现eclipse竟然打不开了,打开出现闪退,原因是: 1.JDK版本不一致,或者你电脑上安装了多个版本: 2.环境变量:安装了其他软件比如:oracle 它自带有一个较低版本的JDK ...

  10. empty 和 isset的区别和联系

    empty 和 isset的区别和联系 要说它们的联系,其共同点就是empty()和isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们 ...