• 什么是继承

      即类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. CentOS7系统时间和硬件时间不同步问题

    CentOS7系统中有两个时间:系统时间 和 硬件时间 我们常用命令 date 会输出系统时间,用 date 命令修改的也是系统时间 硬件时间是写入到 BIOS 中的时间,用 hwclock -r 命 ...

  2. 4.安装fluentd用于收集集群内部应用日志

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-13 11:02:14 星期四 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  3. C++ part1

    C++内存分配 references: C++ 自由存储区是否等价于堆? c++ new 与malloc有什么区别 C++, Free-Store vs Heap 1. 栈:由编译器自动分配释放,存放 ...

  4. CSS 解决Float后塌陷问题

    当父级元素没有设定高度时候,而子集元素设定float类型时候,此时父级元素不能靠子集元素撑起来,所以就形成了塌陷: 示例分析 **1.Float之前的效果** <!DOCTYPE html> ...

  5. Gym 101480F Frightful Formula(待定系数)题解

    #include<cmath> #include<set> #include<map> #include<queue> #include<cstd ...

  6. 无需扫描即可查找和攻击域SQL Server (SPN)

    无扫描SQL Server发现简介 当您没有凭据或正在寻找不在域中的SQL Server时,使用各种扫描技术来查找SQL Server可能非常有用.但是,此过程可能很嘈杂,耗时,并且可能由于子网未知, ...

  7. Androidstudio 新GradlePlugin和Gradle Version对应关系

    Project Gradle AS建议升级到4.2. Plugin对应AS的版本,Plugin工具也要和Gradle对应上,否则某些语法不支持,如果是非必要的建议不要轻易升级. Gradle DSL ...

  8. js Nullish Coalescing Operator

    js Nullish Coalescing Operator 空值合并 const n = null ?? 'default string'; console.log(n); // "def ...

  9. 微信小程序 HTTP API

    微信小程序 HTTP API promise API https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent node-f ...

  10. MySQL 8.x

    MySQL 8.x SQL & NoSQL $ mysql --version # mysql Ver 8.0.21 for osx10.15 on x86_64 (Homebrew) # M ...