• 什么是继承

      即类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. windows7 更新失败,无法开机处理方法

    记录一次今天同事笔记本无法开机的故障处理 windows7系统,安装更新失败,无法开机,卡在配置更新界面 处理方法,强制关机,开机按F8,进入安全模式,安全模式还会卡在配置更新界面,但是卡一会会进入系 ...

  2. 系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案

    一.问题由来 前一段时间本人的电脑崩溃了,系统还原之后,eclipse就用不了,也找不大原因.eclipse报错原因是jvm出现问题:JVM terminated Exit code=2 C:\Pro ...

  3. How to get the real screen size(screen resolution) by using js

    How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...

  4. CSS pseudo classes All In One

    CSS pseudo classes All In One CSS 伪类 https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes ...

  5. 使用 js 实现十大排序算法: 选择排序

    使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  6. js 十大排序算法 All In One

    js 十大排序算法 All In One 快速排序 归并排序 选择排序 插入排序 冒泡排序 希尔排序 桶排序 堆排序(二叉树排序) 基数排序 计数排序 堆排序(二叉树排序) https://www.c ...

  7. Chrome 黑科技

    Chrome 黑科技 秒变记事本 data:text/html, <htmlcontenteditable> OK <a href="data:text/html, &qu ...

  8. js & while & do while

    js & while & do while https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Stat ...

  9. how to check a var whether is number in js

    how to check a var whether is number in js js check var is number Number.isInteger(NaN) false Number ...

  10. go语言第一天(变量与基本类型)

    第一个go程序: //导入主函数的包package main//fmt format 包含格式化输入输出import "fmt"//注释 注释不参与程序编译 可以帮助可以程序//行 ...