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

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

本篇文章探讨一下python中的几个概念:协议 、鸭子类型 、 抽象基类 、混入类。 一、协议 在python中,协议是一个或一组方法。...三、抽象基类 抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。 那么抽象基类这样实现的目的是什么呢? 假设我们在写一个关于动物的代码。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象基类关联起来的类叫做虚拟子类,虚拟子类不会继承注册的抽象基类,而且任何时候都不会检查它是否符合抽象基类的接口...为了避免运行时错误,虚拟子类要实现所需的全部方法。 抽象基类并不常用,但是在阅读源码的时候可能会遇到,因此还是要了解一下。 四、混入类(mixin class) 混入类是为代码重用而生的。...在 Python 中没有把类声明为混入的正规方式,所以强烈推荐在名称中加入 ...Mixin 后缀。

1.9K20

惯用法之CRTP

其实,这样做的目的其实很明确,从基类对象的角度来看,派生类对象其实就是本身,这样的话只需要使用类型转换就可以把基类转化成派生类,从而实现基类对象对派生对象的访问。...派生类Derived中定义了一个成员函数imp(),而该函数在基类Base中是没有声明的,所以,我们可以理解为对于CRTP,在基类中调用派生类的成员函数,扩展了基类的功能。...而对于普通继承,则是派生类中调用基类的成员函数,扩展了派生类的功能,这就是我们所说的颠倒继承。 使用场景 俗话说,存在即合理。既然有CRTP,那么其必然有自己存在的道理。...但是,问题在于Base类实际上是一个模板类,而不是一个实际的类。因此,如果存在名为Derived和Derived1的派生类,则基类模板初始化将具有不同的类型。...// virtual Base *v1 = new Derived; Base *v2 = new Derived1; 正是因为基于CRTP方式的指针具有不同的类型,所以不能将CRTP基类指针存储在容器中

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

    Java 中到底是应该用接口类型 还是实现类的类类型去引用对象?

    如题,Java 中到底是应该用接口类型 还是实现类的类类型去引用对象?首先贴出答案: 应该优先使用接口而不是类来引用对象,但只有存在适当的接口类型时 。...标题描述的情况在实际应用中的代码: //implA 为接口 ClassB为其实现类 implA A=new ClassB();//接口类型的引用变量A 去接收对象地址 //或者 ClassB A=new...,调用B类方法,我们很容易就会习惯的写出: A temp=new B(); 用接口类型的引用变量temp,去接收实现类B实例化出来的对象地址(这里的=是传递的地址)。...,若我们仍然使用接口来引用对象时PetInterface p = new Cat(),那些仅仅存在实现类中的方法,是无法直接调用的即p.batheSelf()无法调用会报错。...当然也存在向下转型, //p.batheSelf();替换为下面形式 ((Cat)p).batheSelf();//向下转型,可正常调用执行 参考文章: Java 中到底是应该用接口类型 还是实现类的类类型去引用对象

    1.6K30

    CRTP避坑实践

    容器存储 CRTP技术因为其性能优越,实现简单,在工程应用中非常广泛。实际上,相对于普通的虚函数,其具有一定的局限性。问题在于Base类实际上是一个模板类,而不是一个实际的类。...因此,如果存在名为Derived和Derived1的派生类,则基类模板初始化将具有不同的类型。...在上一篇文章中,有提到,如果派生类没有实现某个基类中定义的函数,那么调用的是基类的函数。...• 派生类中没有实现PrintType()函数 • 因为派生类中没有实现PrintType()函数,所以在基类进行调用的时候,仍然调用的是基类的PrintType()函数 正是因为以上几点,所以才导致了这种递归调用引起的堆栈溢出...在基类中重新定义了另外一个函数PrintTypeImpl(),这样在调用PrintType()的时候,如果派生类中没有实现PrintTypeImpl()函数,则会调用基类的PrintTypeImpl()

    79630

    模板编程高级技巧与实战

    一、 CRTP(奇异递归模板模式)1.1 静态多态与代码复用核心思想:通过模板参数将派生类类型传递给基类,利用编译时多态替代运行时虚函数调用。这种技术能减少内存占用(无需虚函数表)并提升执行效率。...MessageBox(nullptr, L"Button Draw", L"CRTP Demo", MB_OK); }};static_cast:将基类指针转换为派生类指针...override:C++11引入的关键字,强制要求派生类重写该方法1.2 Windows控件优化实践性能对比:传统动态多态方式需要维护虚函数表(vtable),每次调用产生间接跳转开销。...30%-50%(实测数据)适用场景:高频调用的UI控件基类、需要极致性能的场景1.3 实战技巧扩展静态成员访问:templateclass ResourceManager...、 模板元编程实战3.1 编译时安全检查驱动开发中的句柄验证:#include // C++20 Concepts强化类型约束templateconcept

    17320

    浅析C++中的CRTP

    CRTP的基本思想:基类模板以派生类作为模板参数,在基类接口中将this指针强转为派生类指针,调用派生类中的方法,从而实现了一种静态多态性。...,定义了一个commonMethod方法,它通过CRTP的方式调用派生类中的方法implementation。...派生类Derived1和Derived2都继承自CBase,并实现了implementation方法。通过CRTP,我们可以在基类中调用派生类的方法,而不需要使用虚函数的运行时开销。...回归CRTP,自定义类需要将自身作为模板参数传递给 std::enable_shared_from_this,在派生类中才可以使用 std::enable_shared_from_this 提供的 shared_from_this...实现策略模式:CRTP可以用于实现策略模式,将不同的策略封装在不同的派生类中,并在编译期确定使用哪种策略。

    6200

    C++多态性能测试:CRTP vs std::variant vs virtual

    C++多态性能测试:CRTP vs std::variant vs virtual 多态是面向对象编程的一个重要概念,它使得单一接口能够代表不同的类型。...C++提供了几种实现多态性的方式,本文将会讨论三种场景的多态: 虚函数:在C++中实现多态性的传统方式是使用虚函数。这涉及使用基类和派生类来实现特定的实现。...std::variant:在C++17中引入的std::variant,它实现了一种无需继承的多态性。...CRTP(Curiously Recurring Template Pattern):CRTP是一种比较特殊的技术,它通过模板的奇特递归模式实现多态性。...测试的组合场景如下: 单纯crtp crtp + std::variant virtual std::variant + std::visit std::variant + std::get_if std

    41110

    经典永不过时!重温设计模式

    你必须实现父类中所有的抽象方法,即使它们没什么用。 在重写方法时,你需要确保新行为与其基类中的版本兼容。...: 替换原则是用于预测子类是否与代码兼容,以及是否能与其超类对象协作的一组检查。...在套接字创建时,根据参数中的协议族、协议类型、协议号信息,调用协议族的create函数执行创建,绑定具体协议proto指针到该vptr上,自此实现了静态类型到动态类型的绑定。...CRTP包含: 从模板类继承, 使用派生类本身作为基类的模板参数。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 这样做的目的是在基类中使用派生类。...从基础对象的角度来看,派生对象本身就是对象,但是是向下转换的对象。因此,基类可以通过将static_cast自身放入派生类来访问派生类.

    1.2K40

    oracle中varchar2类型的最大长度是_oracle修改字段长度sql

    大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说oracle中varchar2类型的最大长度是_oracle修改字段长度sql,希望能够帮助大家进步!!!...在设计表的时候,设计了一个未来可能会使用的字段,varchar2类型,长度较长。因为目前不会使用,因此想到这样设计会否暂用额外空间。...根据VARCHAR2的定义,为可变长 度的字符串,因此应该不会占用多余空间,在找了一些资料之后,验证了这个结论。...但是会否影响插入或者查询效率呢,本人没有研究过数据库底层原理,但基于基本的逻辑判断 以及对数据库的信任,拍脑袋判断影响不大。...因此,在80%后期会使用的字段,可以预先创建,否则,还是等需要再建吧,以免造成误解。 今天文章到此就结束了,感谢您的阅读,Java架构师必看祝您升职加薪,年年好运。

    3.5K30

    C++中的提供的四种类型转换方式;

    ,比如将一个指针转换为一个完全不相关类型的指针,而且它不进行运行时类型检查,对于向下转型(将基类指针或引用转换为派生类指针或引用)可能存在风险,如果转换的对象不是期望的派生类类型,会导致未定义行为。...static_cast的转换规则限制 static_cast是基于类型兼容性进行转换的,对于指针类型,它主要用于在类层次结构中的向上转型(安全的,因为派生类包含基类的所有信息)以及相关类型指针之间有意义的转换...向下转型(基类到派生类) 转换规则:当进行向下转型时,dynamic_cast会在运行时检查被转换对象的实际类型。只有当基类指针或引用实际指向的是目标派生类类型(或其派生类)的对象时,转换才会成功。...(const std::bad_cast& e) {} 应用场景:这种运行时类型检查机制使得在复杂的类层次结构中,可以安全地进行向下转型操作,尤其是当通过基类指针或引用操作对象,但在某些情况下需要访问派生类特有的成员或功能时非常有用...所以,dynamic_cast主要用于处理类层次结构中的类型转换,无论是向上转型、向下转型还是在多继承等复杂场景下的交叉转型,都利用了其运行时类型检查的特性来确保安全。

    7810

    C++雾中风景14:CRTP, 模板的黑魔法

    笔者在进行数据库源码学习和开发时,发现无论是Clickhouse还是Doris中也同样大量使用了这种编程技巧来简化代码和提高性能。 接下来,用一杯咖啡的时间,来和大家详细聊聊这种模板的黑魔法。...它核心的作用是利用子类的信息来生成代码,我们来具体看看对应的代码实现 这里通过子类的模板信息,在父类之中派生出一个指向自身的weak_ptr。...所以,其实CRTP只不过是表面上看起来有些"唬人"。它的核心作用就是只有一条:是利用子类的信息来生成代码。...CRTP的方式继承了InternalQueue::Node, 便自动拥有了成为Queue中节点的能力,能够成为线程安全的Queue的元素了。...管中窥豹,我们可以通过CRTP看到C++模板的强大魅力。无论是在代码简化,性能提升方面都值得我们继续深入思考学习,也欢迎大家多多讨论,指教。

    1.7K32

    C++转型操作符 VS 强制类型转换:为何前者更胜一筹?

    调用显式或隐式的转换函数,可增加代码可读性。在继承体系中进行类型转换:向上转换(派生类到基类)通常是安全的隐式转换,无需使用 static_cast。...向下转换(基类到派生类)需使用 static_cast,但不能通过虚拟继承转换,且不进行运行时检查,若目标类型并非对象实际类型会导致未定义行为。...在基于 const 重载成员函数时很有用,但修改原本为 const 的值是未定义行为,除非原始变量本身不是 const。...要求源对象和目标对象必须大小相同且是平凡可复制的,声明在 头文件中。若无法使用 C++20,可用 memcpy 实现类似功能。...使用 dynamic_cast 将基类指针 b 转换为派生类指针 d,由于 b 指向 Derived 类对象,转换成功,避免了非法访问。

    8300

    《C++显式类型转换:解析多种转换方式的奥秘》

    当进行向上转型时,即将派生类指针或引用转换为基类指针或引用,静态_cast是安全的,因为它遵循了 C++的类型层次规则。...这意味着如果使用不当,可能会导致未定义的行为,比如将一个不相关类型的指针进行转换。 动态_cast 动态_cast主要用于在类层次结构中的安全向下转型。...与静态_cast不同,动态_cast在运行时会进行类型检查。当我们将一个基类指针或引用转换为派生类指针或引用时,它会检查对象的实际类型。...如果转换是合法的,即对象确实是目标派生类类型或者其派生类的对象,那么转换成功;否则,返回一个空指针(对于指针类型)或者抛出一个 std::bad_cast 异常(对于引用类型)。...这种运行时检查机制使得动态_cast在处理多态类型转换时非常有用。例如,在一个图形绘制系统中,有基类 Shape 和派生类 Circle、Rectangle 等。

    8400

    C++:16---强制类型转换和类型转换

    支持运行时类型识别,使用形式如下所示: 在第一种形式下:e必须是一个有效的指针 在第二种形式下:e必须是一个左值 在第三种形式下:e不能使左值 type:必须是一个类类型,并且通常情况下该类型应该含有虚函数...e的类型必须符合以下三个条件中的任意一个: e的类型是目标type的公有派生类 e的类型是目标type的公有基类 e的类型就是目标type的类型 出错时的返回值: 如果一条dynamic_cast语句的转换目标是指针类型且失败了...运算符:用于返回表达式的类型 dynamic_cast运算符:用于将基类的指针或引用安全地转换成派生类的指针或引用 当我们将这两个运算符用于某种类型的指针或引用,并且该类含有虚函数时,运算符将使用指针或引用所绑定对象的动态类型...这两个运算符适用于以下的情况: 我们想使用基类对象的指针或引用执行某个派生类操作,并且该操作不是虚函数 一般来说,只要有可能我们应该尽量使用虚函数。...: 可以在一个操作中同时完成类型转换和条件检查两项任务 而且,指针dp在if语句外部是不可访问的。

    2K20

    【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】

    二、虚函数实现多态的原理 在 C++ 等支持面向对象编程且有多态特性的语言中,将基类与派生类中原型相同(函数返回类型、函数名、参数列表都相同)的函数声明为虚函数,是实现多态的关键手段。...对比来看,如果一个成员函数在继承树中基类和派生类多次定义,但没有声明为虚函数,那么当基类指针指向派生类对象时,调用哪个成员函数是由指针的类型决定的,而且这种调用关系在编译时就已经确定了,是一种静态绑定机制...形参表:列出函数接受的参数的类型和参数名(参数名可省略,如果只是声明函数时,在函数实现时再写具体参数名),形参表决定了函数的参数特征,在派生类重写虚函数时,形参表必须和基类中对应的虚函数形参表完全一致(...函数的返回类型在满足一定条件下可以有协变类型(即返回类型可以不同,但要满足是指针或者引用类型,并且派生类返回的指针(或引用)指向(或绑定)的类型是基类返回的指针(或引用)指向(或绑定)类型的派生类),不过一般简单的情况还是返回类型相同居多...例如,在存在继承关系的类层次结构中,通过基类指针指向派生类对象时,我们可以利用 typeid 结合 strstr 来准确判断指针实际指向的对象具体属于哪一个派生类,进而执行相应的、针对该派生类特性的操作逻辑

    9310

    多态调用规则

    C++ 中的多态调用规则 在 C++ 中,多态是面向对象编程的一个重要特性,它允许我们通过基类指针或引用来调用派生类中的方法。...我们定义了一个基类 A 和一个派生类 B。...基类 A 中的 Test 方法被声明为 virtual,这使得我们可以在派生类中重写它。...这是因为 Test 方法是虚函数,允许动态绑定。 引用调用: B b; A& a = b; a.Test(); // 调用 B::Test 在这种情况下,我们使用基类引用 a 指向派生类对象 b。...注意事项 在使用虚函数时,确保在基类的析构函数中也声明为虚函数,以避免资源泄漏和未定义行为。此外,尽量避免在类的成员函数中使用 delete this,除非你非常清楚对象的生命周期管理。

    8610

    你该知道的C++四种显式类型转换

    ++标准对此类行为没有做出明确规定.同一份代码在使用不同的编译器会有不同的效果.在 vs2017 下,,虽然代码中 c_val , use_val , ptr_val 看到的地址是一样的.但是c_val...用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。...注意:进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。...,但是输出给 base2sub 是一个 nullptr ,说明dynami_cast 在程序运行时对类型转换对“运行期类型信息”(Runtime type information,RTTI)进行了检查....这个检查主要来自虚函数(virtual function) 在C++的面对对象思想中,虚函数起到了很关键的作用,当一个类中拥有至少一个虚函数,那么编译器就会构建出一个虚函数表(virtual method

    1.9K20
    领券