首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python中的协议 、鸭子类型 、 抽象基类 、混入类

本篇文章探讨一下python中的几个概念:协议 、鸭子类型 、 抽象基类 、混入类。 一、协议 在python中,协议是一个或一组方法。...注意,自己定义的抽象基类要继承 abc.ABC(abc.ABC 是 Python 3.4 新增的类,python2的语法不是这样的)。...除了继承,还有一种方法可以将类和抽象基类关联起来: 示例3,在示例2后面添加代码: @Animal.register class Cat(Animal): def eat(self):...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象基类关联起来的类叫做虚拟子类,虚拟子类不会继承注册的抽象基类,而且任何时候都不会检查它是否符合抽象基类的接口...为了避免运行时错误,虚拟子类要实现所需的全部方法。 抽象基类并不常用,但是在阅读源码的时候可能会遇到,因此还是要了解一下。 四、混入类(mixin class) 混入类是为代码重用而生的。

1.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态的理解层次 | 父类指针和子类指针步长 )

    是 根据 指针类型 进行的 , 指针 自增 ++ , 指针的地址值 会增加 指针类型字节大小 ; 指针的 步长 是 根据 指针 指向的 内存空间 的数据类型确定的 ; 子类 继承 父类 , 如果 子类...没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 的步长是相同的 ; 一、不建议将所有函数都声明为 virtual 虚函数 C++ 类中 , 每个 成员函数 都可以声明为 virtual...这里建议不需要将有 多态 需求的函数声明为 虚函数 ; 二、多态的理解层次 多态的理解层次 : 多态实现效果 : 相同的代码调用 , 有不同的表现形态 ; 父类指针 可 指向子类对象 , 使用父类指针...调用 虚函数 可执行 子类对应的函数 ; 多态实现条件 : ① 继承 , ② 虚函数重写 , ③ 父类指针/引用指向子类对象 ; 父类指针 可以 指向 父类对象 , 也可以指向 不同的 子类对象 ;...是 根据 指针 指向的 内存空间 的数据类型确定的 ; 子类 继承 父类 , 如果 子类 没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 的步长是相同的 ; 代码示例 : #include

    30350

    C++核心准则​讨论:将基类的析构函数设为公共和虚拟的,或受保护的和非虚拟的

    Discussion: Make base class destructors public and virtual, or protected and non-virtual 讨论:将基类的析构函数设为公共和虚拟的...这种情况导致较早的编码标准对所有基类析构函数都必须是虚拟的提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当基类析构函数是公共的时,才将它们虚函数化。...因此,如果可以调用(即是公共的)基类析构函数,则它是虚拟的,否则是非虚拟的。...B是可以自己实例化的基类和具体类,因此析构函数必须是公共的,才能创建和销毁B对象。...然后,即使析构函数必须是公共的,也可能会面临很大的,不将其虚函数化的压力,因为作为第一个虚拟函数,当永远不需要添加的功能时,它将招致所有运行时类型的开销。

    1.1K20

    Python类

    a添加变量或者赋值,可以直接用“.”加变量赋值即可 2.类的构造器         __init__构造函数,在生成对象时调用。   ...__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去 3)在传递参数的时候,必须是传递两个参数,name和sex,不然报错;Self的参数不用传递,python自动会把...__init__方法不会调用 2)Python总是首先取子类中的方法,如果子类没有找到,才会去父类中查找 3)子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run() 例子: class...区别于在类中调用普通函数时并不需要带上self参数  3)Python总是首先查找对应类型的方法,如果它不能在派生类(子类即当前类)中找到对应的方法,它才开始到基类(父类)中逐个查找。...(先在本类中查找调用的方法,找不到才去基类中找)。  4)由上面的关系,可以进行方法的重写,在子类中重写父类方法。

    98020

    Python “异常处理机制” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

    在子类的构造函数外部调用super() 题39:在Python中,metaclass的主要作用是什么? A. 定义类的行为 B. 定义对象的行为 C. 管理类的内存分配 D....题31: 答案:D 解析:super()函数在Python中用于调用父类的方法,包括但不限于__init__。它允许子类调用父类中定义的方法,而无需直接引用父类名。...当子类定义了与父类同名的方法时,子类的方法将覆盖父类的方法。 题35: 答案:B 解析:在Python中,__mro__属性代表方法的解析顺序(Method Resolution Order)。...题目19: 错误 解析:如果一个函数内部抛出了一个异常,但该异常在函数外部没有被捕获,那么异常会传播到调用该函数的地方。...Exception是所有标准异常的基类(除了SystemExit、KeyboardInterrupt和GeneratorExit),因此自定义异常类通常应该继承自它或它的子类。

    8110

    Python面向对象总结及类与正则表达式

    Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。...的写法,其实这个写法和在类外面 a.scolia = 'good' 效果一样,是为了添加属性,只不过 __init__ 方法是实例化时自动调用的函数,所以适合进行初始属性的创建。   ...2.Python面向对象的三大特性 一、继承   面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类、基类,继承的类叫做派生类、子类。...函数来实现,比如super().父类方法名(除self外的其他参数),其实在super函数中还需要传入子类名和子类对象(在类中用self),但是我们使用时不需要特意去传,除非在类外单独调用父类的方法。...staticmethod静态方法装饰器:将类内的方法变成普通的函数,或者把类外的函数放到类内当作方法调用 ?

    47630

    python学习16:类和继承(关键字class)

    参考链接: Python继承 类的定义  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。...通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。...但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。    继承概念的实现方式主要有2类:实现继承、接口继承。  实现继承是指使用基类的属性和方法而无需额外编码的能力。...OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 ...("person is talking...") # 定义一个子类,继承了父类person class Chinese(Person): # 子类的构造函数:先继承,再重构     def __init

    84230

    Python面向对象编程Day 25部分

    可以访问类的数据属性和函数属性,但不能访问实例的属性。   类调用类方法的时候传不传参数?有自动传递参数。   类方法用来访问类属性。...,继承就是延续之前的功能 继承具有两种含义:1.继承基类的方法,并且做出自己的改变或者扩展(减少代码重用);2.声明某子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法。...(第一种含义意义并不大,甚至通常是有害的,因为它使得子类和基类出现强耦合,而程序倡导解耦合;而第二种含义的意义非常重要,叫做接口继承,接口就是方法(一个具体的函数),子类必须实现父类的方法) Python...经典类继承(基类没有任何继承关系,不继承object)(python2):深度优先 新式类继承(python3默认;python2):广度优先 __mro__生成解析顺序元组(经典类没这个方法)  最后一步找的...真正的接口继承要import abc  基类参数写metaclass=abc.ABCMeta  @abc.abstractmethod  确保子类必须实现接口 归一化,就是只要是基于同一个接口实现的类,

    32420

    Python3 面向对象

    对象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。...继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。...方法:类中定义的函数。 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。... 要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。...,你可以在子类重写你父类的方法 super() 函数是用于调用父类(超类)的一个方法。

    48620

    Python学习手册之类和继承

    在上一篇文章中,我们介绍了 Python 的函数式编程,现在我们介绍 Python 的类和继承。...类中所有方法都必须将 self 作为它们的第一个参数,尽管它没有显式传递,但是 Python 将 self 参数添加到列表中。在调用方法时不需要包含它。在方法定义中,self 引用调用该方法的实例。...在上面的实例中,__init__ 方法接受两个参数,并将它们分配给对象的属性。__init__ 方法称为类构造函数。 方法 类可以定义其他方法用来添加一些功能。...>>> 在 OOP 程序设计中,当我们定义了一个 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类 (Subclass) , 而被继承的 class 称为基类、父类或超类...>>> 上面例子中 Animal 是父类,Cat 是子类。 子类同样可以做为父类被继承,这样继承的子类拥有两个父类的方法和属性。

    40420

    SqlAlchemy 2.0 中文文档(三十一)

    注意 AbstractConcreteBase延迟了基类的映射器创建,直到所有子类都已定义,因为它需要创建一个针对包含所有子类表的可选择项的映射。...(id=5)) ) 参数: strict_attrs – 当在基类上指定时,“严格”属性模式被启用,试图将基类上的 ORM 映射属性限制为仅当下立即存在的属性,同时仍保留“多态”加载行为。...这再次与 SQLAlchemy ORM 在创建构造函数时实际执行的操作相匹配,不应与诸如 Python dataclasses之类的验证系统的行为混淆,后者将生成一个根据注释匹配的构造函数,包括可选和必需的属性...这再次与 SQLAlchemy ORM 实际创建构造函数时的行为相匹配,不应与诸如 Python dataclasses 之类的验证系统的行为混淆,后者将生成一个与注释匹配的构造函数,以确定可选 vs....API 参考 对象名称 描述 Mutable 定义更改事件透明传播到父对象的混合类。 MutableBase Mutable和MutableComposite的通用基类。

    44420

    Py测开《多态和鸭子类型的区别》

    封装:将数据和方法放在一个类中就构成了封装。 继承:Python中的一个类可以继承一个类也可以继承多个类,被继承的类叫父类(或者叫基类,base class ),继承的类叫子类。...Python中定义一个函数,只要函数给它传参数,对于函数的参数是没有类型限制的。 c和java定义一个函数,函数的参数是有类型限制的。指定这个函数的参数只能传什么类型。...a这个参数没类型限制,传个类进去也行,传个函数进去也可以,传个对象进去也可以,传什么都可以,没有类型限制。 #Python中函数的参数是没有类型限制的。...假如Python是个强类型语言。函数只能传父类(Base)这个类型的数据。接下来子类的对象是不是属于这个父类? # 伪多态的实现。...Python中鸭子类型:新定义一个类,在类里面同样实现这个方法,在方法里面写一些不同的代码,同样是调用这个函数,同样是传一个对象,可以做一些不同的事情。

    55010

    day 24-1 继承

    继承 什么是继承:   继承是一种创建新类的方式,在 python 中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 父类必须在子类上面   一个类 可以被多个类继承...  一个类 可以继承多个父类 —— python 里 class A:pass #父类 基类 超类 class B:pass class A_son(A):pass #子类 派生类 class...__dict__) per.attack(dog) print(dog.hp) dog.eat() print(dog.hp,dog.aggr) 派生 当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性...父类名.方法名 需要自己传 self 参数 super().方法名 不需要自己传 self 正常的代码中 单继承 === 减少了代码的重复 继承表达的是一种 子类和父类的关系 super 的用法   只在新式类中有...,python3 中所有类都是新式类   在类中使用 不需要传 self 参数,在类外使用必须要传 类 和 对象   查找自己所在类的父类 class Animal: def __init__(

    32720

    Python里面这些点,据说80%的新手都会一脸懵逼

    其实这个Python里面的函数入参的几种形式,假如你来设计一个语言,一个函数fun(),里面要传参数进来,要考虑扩展性:变量会有很多种形态,有可能是变量,也可能是数组,也可能是结构体,或者是哈希数组。...比如你有一个累加功能的函数: ? image.png 每次调用函数都要传一个列表或者元组进去,非常死板,不灵活,如果我要传多个列表,多个变量,我又不想改接口,但是改成下面这样就灵活很多: ?...Python当然也有这样的设计,其实如果学过Java会非常好理解!比如子类要调用父类的方法,或者覆盖父类的方法都会用到super(). 1).调用父类的方法 ?...image.png C++里面有抽象基类的概念,Python里面的类在设计的时候,也考虑到了这一点,但是由于Python本身的特性是一切皆对象,大部分的时候都依赖鸭子类型。...这个类的目的就是让继承它的子类一定要实例化fly函数,否则子类也永远无法实例化 ?

    40930

    【C++】详细讲解继承(上)

    派⽣类和基类中有同名成员,派⽣类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。...不会,子类把父类同名函数隐藏了,直接报错。 如果传参,像下面这样,就会调用子类里的fun函数。..._num) { //假设里面是深拷贝资源的拷贝逻辑 } Same是父类,Same后面的括号里应该传父类的对象,但是我们没有父类的对象,只有子类的对象s,为什么可以直接传s过去?...这里用到的就是前面说过的 子类和父类对象赋值兼容转换 。我们要拷贝父类的那一部分,就要把父类的那一部分拿出来,我们把子类对象s传给父类Same,Same的拷贝构造函数是引用传参。...//自动调用父类析构 } 4.2 实现一个不能被继承的类 ⽅法1:将基类的构造函数 私有 ,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象

    4000

    面对对象总结

    __module__ : 类定义所在的模块 二、面向对象三大特性 1、继承 继承的定义: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类...__bases__ ② 如果没有基类,那么默认继承object类 派生: 当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名...接口类: ① 声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 ② 可以通过abc模块来限制子类必须要有接口类的方法...__方法名(参数) ③私有实现的原理 其实只是python将私有属性改了一下名字,可以通过 类名....如果传一个对象给你,你可以查出它有什么能力,这是一项强大的特性。如果Python不支持某种形式的自省功能,dir和type内建函数,将很难正常工作。

    1.1K90

    Python入门(16)

    关于方法,它有一个特殊的参数self 与普通函数的区别:除了它隶属于某个类,在它的参数列表的开头,还需要添加一个特殊的参数 self ,但是你不用在调用该方法时为这个参数赋值,Python 会为它提供。...然后,再向这些子类型中添加一些必要的独有的特征。 父类 :SchoolMember ,又被称作基类(Base Class)或是超类(Superclass)。...(3)、如果子类中定义了__init__ 方法,将优先被调用,如果此时需要调用基类的__init__ 方法,则需要显式地进行调用。...比如,我们在 Teacher 和 Student 子类中定义了 __init__ 方法, Python 就不会自动调用基类 SchoolMember 的构造函数,必须自己显式地调用它。...相反,如果我们没有在子类中定义 __init__ 方法,Python 将会自动调用基类的该方法。 (4)、修改父类的任何功能,它将自动反映在子类中。相反,子类的修改,则不会影响到其他的子类。

    85210

    Python第七章-面向对象高级

    通过继承创建类时, 所创建的类将继承其基类所有的属性和方法, 派生类也可以重新定义任何这些属性和方法, 并添加自己的新属性和方法 3.2 继承性的意义 继承实现代码的重用,相同的代码不需要重复的编写...__()的调用规则 如果子类没有手动__init__()方法, 则 python 自动调用子类的__init__()的时候, 也会自动的调用基类的__init()__方法. class Father:...(self): pass s = Son() ---- 如果子类手动添加了__init__(), 则 python 不会再自动的去调用基类的__init__() class Father...(override) >重写,就是子类将父类已有的方法重新实现。 父类封装的方法,不能满足子类的需求,子类可以重写父类的方法。在调用时,调用的是重写的方法,而不会调用父类封装的方法。...] object是python为所有对象提供的基类,提供有一些内置的属性和方法,可以使用 dir函数查看 新式类:以object为基类的类,推荐使用 经典类:不以object为基类的类,不推荐使用

    38120
    领券