• 什么是继承

      即类A可以使用类B的方法,即B是A的父类,A是B的子类,AB之间是继承关系

      class Father():  # 父类

      def __init__(self,name,age):

      self.name= name

      self.age= age

      def myself(self):

      print('大家好!我是%s,今年%s岁'%(self.name,self.age))

      class Son(Father):      # 子类

      pass

      格式如此,子类的()内写上父类的类名,子类的运行的时候,会现在自己内部寻找方法,如果找不到,则会去父类中寻找,如果父类中没有,则回去父类的父类中寻找,所有类的总父类(最上一级的父类,唯一没有父类的类)是系统内部定义的object类

    • 如何查看类的父类情况

      使用内置函数"__bases__"方法

      Father. __bases__  --结果-->  (<class 'object'>,)

      Son. __bases__      --结果--> (<class '__main__.Father'>,)

    • 什么是多继承

      多继承,就是A类在继承B类的同时,还继承了C类,但与此同时,B,C两个类之间,并没有关联

    • 示例如下,Base为定义类,其父类为object,A,B均继承Base,C同时继承A,B

      class Base:

      def play(self):
              print('这是Base')
      class A(Base):

      def play(self):
              print('这是A')
      class B(Base):

      def play(self):
              print('这是B')
      class C(A, B):
          pass
      c = C()

      在C类实例化的时候,会调用C中方法,如果没有,则去父类中寻找,这时候,会按照你C()内的顺序去寻找,即想寻找A中方法,再去B,如果是(B,A)则先找B中寻,当A,B均没有的时候,会去A,B的父类Base中找寻,但是多继承,不建议多层环绕,容易乱。。。。。。

      多继承有先后顺序,执行也会按照顺序,当子类中存在和父类中一样的方法时候,会执行子类中的方法,而忽略掉父类中的方法,即被称作,子类方法覆盖了父类同名方法。

    • 如果在多继承中,子类覆盖父类方法后,仍然调用父类的方法呢?

      class Base:

      def play(self):
              print('这是Base')
      class A(Base):

      def play(self):
              print('这是A')
      class B(Base):

      def play(self):
              print('这是B')

      方法1:在子类中的方法内使用【类名.方法(self)】的方式调用

      class C(A, B):

      def play(self):

      A.play(self)

      print('这是C')

      方法2:使用super().方法(),这是python的内置方法super即指改类的父类【为了方便编写,减少代码的修正,建议使用该方法】

      class C(A, B):

      def play(self):

      super().play()

      print('这是C')

      结果输出如下:

      这是Base

      这是B

      这是A

      这是C

      emmmm,为什么多来了个B?

    • super函数方法

      super的好处显而易见,但是为什么上述代码结果多了个B的运行结果,按照子父类的运行顺序,A运行后,应该是调用的Base啊

      super函数的运行顺序,是按照内置的mro规则运行,可以使用类.mro查看。

      当我们使用C.mro的时候,回到的结果如下:

      [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]

      那么此时,我们的函数会按照这个顺序来调用类的方法,可以看到,顺序为C--->A--->B--->Base--->object,因为Base没有使用super方法,所以跟object无关。

    • 最好,多继承就一层,且是最后一层

      多继承的下面,别再写继承了,脑壳儿疼

    • 魔法方法

      在某些特定情况下会被触发运行的方法

    • 了解运算符的魔法方法

    • __add__(self,other)----------->x+y

      __sub__(self,other)----------->x-y

      __mul__(self,other)----------->x*y

      __mod__(self,other)---------->x%y

      __iadd__(sellf,other)---------->x += y

      __isub__(self,other)----------->x -= y

      __imul__(self,other)----------->x *= y

      __imod__(self,other)---------->x %= y

      __radd__(self,other)----------->y + x

      __rsub__(self,other)----------->y - x

    • __init__方法,初始化

    • 当类在实例化的同时,被传入参数,会直接触发__init__方法,当然,在类中,你需要提前定义好__init__方法,然后实例化的括号内被传入参数,会触发这个方法,不需要再去调用

    • __str__和__repr__方法

      默认情况下,打印实例对象的时候,输出的是内存地址,可以通过修改__str__或者__repr__方法来调整输出内容

    • class Person:

      pass

      a = Person()

      print(a)        #得到内存地址内容

      class Person:

      def __repr__(self):

      return '这里是__repr__返回值'

      a = Person()

    • __call__方法,调用或者叫唤醒

      这个方法可以让类如同函数一样被调用

      函数怎么调用的来着?函数名+()

      当定义了__call__方法后,我们可以使用类名+()的方法调用

      进阶下,如果内部含有__init__方法的时候,你在括号内传入参数,也可以触发。

    • __new__方法,这个方法比较抽象,是针对的内存空间进行操作的

      他会在类实例化操作的同时,在内存中开辟一个空间来防止这个类的内容

      1、__new__方法是在类创建实例化时被调用的

      2、在类实例化时,__new__会在内存中开辟一个空间来,这之后,类的实例化才被完全创建完成

      3、__init__初始化方法是实例化完成后的操作,也就是__new__方法,还在__init__之前执行

      4、__new__(cls,*args,**kwargs),cls参数即class,类本身

    • 学函数的时候我们就知道,我们需要尽可能少的去占用内存,每次实例化,都相当于调用了一次默认的__new__函数,开辟了一个空间,占用了部分内存,假使我们有100000个实例化,内存不是要炸?怎么做可以减少内存占用

      我们可以通过改写魔法方法来使其每次调用的内存空间固定,这样一来,我们每次实例化,都是使用同一块内存空间

    • class A:
          def __new__(cls, *args, **kwargs):
              if not hasattr(cls,'instance'):
              cls.instance = super.__new__(cls)
              return cls.instance
          return instance

      解释下,这段代码:

      定义一个类A,重写__new__方法,在下面写一个判断语句,我假使我要使用的内存空间名字为instance,我就用hasattr(查看参数类中有无该属性)函数判断下定义类A中有没有这个instance的函数属性,有的话,我就拿来用,没有,我就调用他的父类(或者其他某个不变类,一般默认总父类为object,一般不会有傻子去改这个类的方法吧?)的__new__方法创建一个空间,来命名为‘instance’,当下一次实例化的时候,再次判断,会发现已经有这个空间了,就直接拿来覆盖内容使用。

    • 上述内容中__new__,__init__,__str__,__repr__等常用的魔法方法,需要掌握

python基础学习之类的继承、魔法方法的更多相关文章

  1. Python基础学习Day4 列表的使用方法、range 用法、in用法

    一.列表 1.1列表:python基础数据类型之一:其他语言也有列表的概念,js 数组,可索引 ,可切片,可加步长 1.2列表的索引,切片,切片+ 步长 结果: 注意:列表里元素的数据类型,就是它本身 ...

  2. python语法学习第十天--魔法方法

    魔法方法二!!! 属性访问:在对属性任何操作时,都会调用   有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...

  3. python基础学习笔记—— 多继承

    本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO.C3算法 4.super是什么鬼? 一.python多继承 在前⾯的学习过程中. 我们已经知道了 ...

  4. python基础学习笔记——单继承

    1.为什么要有类的继承性?(继承性的好处)继承性的好处:①减少了代码的冗余,提供了代码的复用性②提高了程序的扩展性 ③(类与类之间产生了联系)为多态的使用提供了前提2.类继承性的格式:单继承和多继承# ...

  5. python基础学习(十一)公共方法

    Python内置函数 Python 包含了以下内置函数: 切片 切片 使用 索引值 来限定范围,从一个大的 字符串 中 切出 小的 字符串 列表 和 元组 都是 有序 的集合,都能够 通过索引值 获取 ...

  6. python基础学习之列表的功能方法

    列表:list 格式 li = [1,2,3,4,5,6] 列表内部随意嵌套其他格式:字符串.列表.数字.元组.字典. 列表内部有序,且内容可更改 a = [1,2,3,4]    a[0] = 5  ...

  7. python基础学习之字符串的功能方法

    字符串:str的功能记录(该类需要记忆) .isdecimal():意思是判断是否由数字构成,仅仅可以解析"123" a='123'    d=a.isdecimal()    p ...

  8. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  9. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

随机推荐

  1. Ubuntu Live CD联网修复

    此模式下可以联网修复ubuntu系统下绝大多数问题.进入LIVE CD模式,打开终端执行以下命令: #此处/dev/sda1为ubuntu根分区,工作中根据实际分区情况更改 sudo mount /d ...

  2. 编译安装MySQL 5.5.33

    环境要求: 主机名 IP地址 需要软件及版本 系统版本 mysql.mfyxw.com 192.168.80.135 Mysql5.5.33 5.5.33 1.设定主机名 hostnamectl se ...

  3. Navigator.registerProtocolHandler All In One

    Navigator.registerProtocolHandler All In One Web API custom protocol URL Schemes URL Protocols https ...

  4. WebGL Programming Guide All In One

    WebGL Programming Guide All In One WebGL WebGL Programming Guide All In One Publication date: July 2 ...

  5. no need jQuery anymore & You don't need jQuery anymore!

    no need jQuery anymore & You don't need jQuery anymore! "use strict"; /** * * @author ...

  6. Chrome blocked third-party cookies

    Chrome blocked third-party cookies Chrome Incognito Chrome 无痕模式 https://support.google.com/chrome/an ...

  7. dark theme website

    dark theme website css var dark theme prefers-color-scheme https://developer.mozilla.org/en-US/docs/ ...

  8. 移动端 750px UI 设计稿

    750px UI 设计稿 App 小程序 H5 rem & vh/vw 在移动端页面开发中,UI 一般会用750px(iphone 6)来出设计稿; 然后要求能够做到页面是自适应屏幕的,这种情 ...

  9. 什么是NGK节点?NGK的节点有什么作用?

    从2018年EOS竞选超级节点火爆整个区块链圈,节点和超级节点就成为了热议的话题,时至今日,热度依然不减.节点是项目生态发展的重要组成部分,超级节点对项目的运行.安全更是起着至关重要的作用.   什么 ...

  10. HTTP2 的前世今生

    本文转载自HTTP2 的前世今生 导语 作为一名 Web 后端开发工程师,无论是工作中,还是面试时,对于 HTTP 协议的理解都是必不可少的.而 HTTP2 协议的发布更是解决了 HTTP1.1 协议 ...