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

递归继承是如何工作的?类PersonInfoBuilder<SELF>:PersonBuilder,其中SELF : PersonInfoBuilder<SELF>

递归继承是一种继承关系中的特殊情况,它指的是一个类继承自自身。在递归继承中,一个类可以作为其自身的父类,从而形成一个继承链。

在给定的问答内容中,类PersonInfoBuilder<SELF>继承自PersonBuilder,并且使用了泛型SELF来表示其自身类型。这种设计模式被称为"Curiously Recurring Template Pattern"(奇异递归模板模式),它允许子类在继承父类的同时,将自身作为父类的泛型参数。

通过使用递归继承和泛型,PersonInfoBuilder<SELF>类可以在编译时期实现链式调用和方法的流式构建。这种设计模式常用于构建器模式(Builder Pattern),用于创建复杂对象。

在这个设计中,PersonBuilder是一个基础的构建器类,而PersonInfoBuilder<SELF>则扩展了PersonBuilder,并引入了更多的方法和属性,用于构建更详细的个人信息。SELF作为泛型参数,确保了子类可以正确地继承父类的方法和属性,并且可以在子类中使用自身类型。

递归继承和泛型的结合使得PersonInfoBuilder<SELF>类可以实现链式调用,即在每个方法调用后返回自身的实例,从而可以连续调用多个方法来构建个人信息对象。这种方式提高了代码的可读性和可维护性。

递归继承和泛型的应用场景包括但不限于以下情况:

  • 构建复杂对象时,可以使用递归继承和泛型来实现流式构建,提高代码的可读性和可维护性。
  • 在框架和库的设计中,递归继承和泛型可以用于定义通用的基类,子类可以通过继承和扩展来实现特定的功能。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云产品:https://cloud.tencent.com/product
  • 腾讯云云原生产品:https://cloud.tencent.com/solution/cloud-native
  • 腾讯云数据库产品:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器产品:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网产品:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发产品:https://cloud.tencent.com/product/mobdev
  • 腾讯云存储产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链产品:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙产品:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

设计模式 -- 常用设计模式

LSP继承复用基石,只有当衍生可以替换掉基,软件单位功能不受到影响时,基才能真正被复用,而衍生也能够在基基础上增加新行为。里氏代换原则是对“开-闭”原则补充。...Adapter 模式使得原本由于接口不兼容而不能一起工作那些可以一起工作。  适用性: 你想使用一个已经存在,而它接口不符合你需求。...使得原本由于接口不兼容而不能一起工作那些可以一起工作。 # 应用场景:希望复用一些现存,但是接口又与复用环境要求不一致。  ...3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了单一职责原则(即一个只有一个变化原因),复用性比较差。Bridge模式比多继承方案更好解决方法。...#        模板方法模式结构最简单行为型设计模式,在其结构中只存在父与子类之间继承关系。

2K21

Python多继承、super与MRO算法

尽管这种方式非常直接,但缺点如果父名改变,这就意味着所有使用父子类都需要改变,如果某个子类非常多,就可能会增加非常多代码维护工作量。...在B中并没有直接使用A名字,而是使用了super。如果A名字变化了,只需要修改B即可,并不需要修改B内部代码,这样将大大减少维护B工作量。...首先这个实例要求必须B或B子类实例,所以A()以及其他不相关实例自然就排除在外,那么B()为什么不行呢?其实从语义上来说,B()没问题,但问题这样将产生无限递归后果。...那么什么MRO算法呢? MRO算法: MRO算法一个典型递归操作,现在假设有如下两个函数: 1. mro:用于得到指定MRO列表。...现在拿前面的菱形继承关系为例说明如何得到MRO序列。这个序列第一个元素就是C。

52410
  • Python快速学习第七天

    下面一个说明如何工作例子: >>> a = A() >>> b = B() >>> a.hello() Hello, I'm A. >>> b.hello() Hello, I'm A....它是如何工作 有的读者很想知道property函数如何实现它功能,那么在这里解释一下,不感兴趣读者可以跳过。...实现了其中任何一个方法对象就叫描述符(descriptor)。描述符特殊之处在于它们使如何被访问。...它和迭代器可能近几年来引入最强大两个特性。但是,生成器概念则要更高级一些,需要花些功夫才能理解它使如何工作以及它有什么用处。...本节会介绍如何使用生成器解决经典变成问题。 9.8.1 生成器和回溯 生成器逐渐产生结果复杂递归算法理想实现工具。

    2.3K50

    python 多态和 super 用法

    python 中多态实现非常简单,只要是在子类中实现和父类同名方法,便能实现多态,如果想在子类中调用父方法,有多种方法,但是当涉及菱形继承等问题,super 就成为了比较好解决方案。...普通继承对于比较简单继承关系,通常在子类中有两种方法来执行父方法,示例如下。...需要注意,两种方法都要传入 self,但是在子类中调用父 super 中传入 self子类对象。菱形继承当有多重继承,特别是菱形继承时,这两种方法就有区别了,示例如下。...为了弄清它原理,我们需要花点时间解释下 python 如何实现继承。对于你定义每一个,python 会计算出一个所谓方法解析顺序(MRO)列表。...由于 super 递归调用会继续搜索特性,可能会出现一些意向不到效果,比如下面这个例子:class A(object):def spam(self): print('A.spam')

    12310

    python开发第六篇--递归函数和面

    递归函数 递归函数用法: - 递归函数:在一个函数里在调用这个函数本身。...- 其中数据属性共享给所有对象 - 而动态属性绑定到所有对象 2.创建一个对象/实例就会创建一个对象/实例名称空间,存放对象/实例名字,称为对象/实例属性 在obj.name会先从...obj自己名称空间里找name,找不到则去中找,也找不到就找父...最后都找不到就抛出异常 面向对象三大特性:继承,多态,封装 1.继承 - 继承一种创建新方式,在python中,新建可以继承一个或多个父...- 当新式时,多继承情况下,会按照广度优先方式查找。...- python2默认经典 - python3默认新式 经典继承: class D: def bar(self): print 'D.bar' class C(D):

    32400

    python基础教程:继承

    派生实例化会创建该类一个新实例。方法引用将按以下方式解析:搜索相应类属性,如果搜索方法在派生中找不到,就去基中进行查找,如果基本身也派生自其它,则此规则将被递归地应用。...__class__为int或某个派生自int时为True。 issubclass()来检查继承关系:issubclass(bool, int)为True,因为boolint子类。...语句1 对于多数应用来说,在最简单情况下,你可以认为搜索从父继承属性操作深度优先、从左至右,当层次结构中存在重叠时不会在同一个中搜索两次。...比如,我们要定义一个“助教”,助教帮助老师教学高年级同学。他兼具老师和学生特点,我们可以让这个多重继承“老师”和“学生”。...任何形式为__name标识符(至少带有两个前缀下划线,至多一个后缀下划线)文本将被替换为_classname__name,其中classname为去除了前缀下划线的当前名称。

    53710

    Python中函数式编程与设计模式结合:提高代码可维护性与可扩展性探索

    组合模式组合模式一种结构设计模式,它允许将对象组合成树形结构以表示“部分-整体”层次结构。在Python中,我们可以使用函数和递归来实现组合模式。...,其中Component组合中,Leaf表示叶子节点,Composite表示组合节点。...通过递归地调用display()方法,我们可以显示整个组合对象结构。7. 适配器模式适配器模式一种结构设计模式,它允许将接口不兼容进行合作。...()在上面的示例中,AbstractClass抽象其中定义了模板方法template_method()和一些基本操作。...ConcreteClass具体,它实现了抽象抽象方法required_operation1()。通过调用模板方法,我们可以执行一系列操作,其中一些操作由子类实现。

    10210

    python中super()和__init__()区别

    目录[-] 单继承时super()和init()实现功能类似的 class Base(object): def __init__(self): print 'Base create...__init__() TypeError: must be type, not classobj super不是父,而是继承顺序下一个 在多重继承时会涉及继承顺序,super()相当于返回继承顺序下一个..._init_(), super(childA, self)返回当前继承顺序中childA后一个childB;然后再执行childB()._init()_,这样顺序执行下去。..., 如果本身就会依次继承下一个; 如果继承链里之前便会无限递归下去; 如果继承链里之后便会忽略继承链汇总本身和传入之间; 比如将childA()中super改为:super(childC..., self).init(),程序就会无限递归下去。

    96060

    Python中super()和__init__()关系

    Python中super()和__init__()关系1.单继承时super()和__init__()实现功能类似的class Base(object): def __init__(self...而是继承顺序下一个在多重继承时会涉及继承顺序,super()相当于返回继承顺序下一个,而不是父,类似于这样功能:def super(class_name, self): mro = self...,因此执行顺序A —> B—>—>Base  执行过程相当于:初始化childC()时,先会去调用childA构造方法中 super(childA, self)....__init__(), super(childA, self)返回当前继承顺序中childA后一个childB;然后再执行childB().__init()__,这样顺序执行下去。  ...,如果本身就会依次继承下一个;如果继承链里之前便会无限递归下去;如果继承链里之后便会忽略继承链汇总本身和传入之间;比如将childA()中super改为:super(childC

    72110

    python 魔术方法(一) 自定义容器与类属性控制

    特殊方法 Python 解释器自动调用,因此你无需自己处理,但是,需要注意,这些特殊方法如此强大,同时也存在着很多陷阱,在使用中必须处处小心谨慎。 3. 自定义容器 3.1....获取元素 — __getitem__ __getitem__(self, key) 对于容器来说,获取元素最重要操作,魔术方法 __getitem__就完成了这个工作,每当对对象通过[]操作符获取元素时...获取容量 — __len__ __len__(self) 对于容器,一个很重要操作获取容器中元素数量 — len() 我们曾经介绍过 Python 对象内存结构: python 内存管理与垃圾收集...元素更改与删除 — __setitem__ 与 __delitem__ __setitem__(self, key, value) __delitem__(self, key) 上面我们实现容器不可变...__missing__ __missing__(self, key) 如果你一个继承自 dict 字典,并且你没有实现自己 __getitem__ 方法,那么当默认 __getitem__

    61520

    Python基础教程

    封装(Encapsulation):对外部世界隐藏对象工作细节。 继承(Inheritance):以通用为基础建立专门对象。 7.1.1 多态 术语多态意思“有多种形式”。...真正重要如何让对象按照你所希望方式工作,不管它是不是真正类型(或者)。 7.1.2 封装 封装指向程序中其他部分隐藏对象具体实现细节原则。...但是封装并不等同于多态,多态可以让用户对于不知道什么(对象类型)对象进行方法调用,而封装可以不用关心对象是如何构建而直接进行使用。...7.1.3 继承 略 7.2 和类型 7.2.1 到底是什么 一种对象,所有的对象都属于某一个,称为实例(instance)。...7.2.6 检查继承 如果想要查看一个是否另一个子类,可以使用内建issubclass函数。

    76220

    Python干货——单例模式

    人总是在反省中进步! 大家好!我你们老朋友Java学术趴。今天给大家分享一下如何在Python中创建一个单例模式。...其中一个用来访问私有化属性方法,一个用来修改私有化属性方法。那么,这样对于调用者来说 感觉就是在调用一个方法,并不是访问属性。...继承自object新式才有new这个魔术方法注意事项:new在一个对象实例化时候所调用第一个方法new至少必须存在一个参数cls(可以自定义),代表要实例化,此参数在实例化时候由Python...在new方法中,不能调用自己new方法,即:return cls._ new_(cls),否则会报错(超过最大递归深度)new方法一个静态方法使用new方法前提:这个必须继承了超object...,因为存在默认继承,所以可以省略不写即使我们在中没有写new方法,在创建实例对象时候Python也会默认自动调用,如果写了就调用我们自己写new方法# __new__方法和单例模式class Animal

    57350

    Python升级之路( Lv7 ) 面向对象深入

    主要讲述了继承和多态: 继承某个父, 可以实现并重写父方法, 并且所有继承Object, 因此可以使用很多Object提供特殊方法和特殊属性; 而多态指不同子对象在调用父方法时会有不同体现...而面向对象编程具有三大特性:继承、封装(隐藏)、多态 具体含义如下 继承: 继承可以让子类具有父特性,提高了代码重用性 从设计上一种增量进化,原有父设计不变情况下,可以增加新功能,或者改进已有的算法...,李四休息玩游戏,程序员休息“敲几行代码” 继承 继承面向对象编程三大特征之一....深拷贝: 使用 copy 模块 deepcopy 函数,递归拷贝对象中包含子对象 深拷贝:拷贝时,拷贝源对象,也递归拷贝对象中包含子对象 如图所示: 实操代码 print("====...工厂使用单例模式,也就是说只能有一个工厂对象 (2) 工厂中可以生产各种品牌电脑:联想、华硕、神舟 (3) 各种品牌电脑使用继承实现: (4) 父Computer,定义了calculate

    46310

    Python中实现简单插件框架

    实现基础插件 我们先构建一个基础插件:plugin_collection.py class Plugin: """ 该基每个插件都需要继承,插件需要实现基定义方法"""...PluginCollection基础组件实现如下:plugins_collection.py class PluginCollection: """ 该类会通过传入package查找继承了...Plugin插件 """ def __init__(self, plugin_package): self.plugin_package = plugin_package...PluginCollectionwalk_package方法,该方法按如下步骤操作: 1、操作package里所有的模块 2、针对找到模块,检查是否Plugin子类,非Plugin自身。...该检查好处你可以放入其他Python模块,也并不影响插件使用 3、检查当前package下子目录,递归查找插件 def walk_package(self, package):

    2.3K10

    iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法

    二、棋盘中独立棋格设计     我们知道,五子棋游戏棋盘由横纵交叉两组平行线组成,每一个横纵线交点即是棋盘上可以落子点。... addSubview:view];     } @end 三、游戏棋盘设计     创建一个继承于UIView,作为五子棋游戏棋盘,命名为GameView实现如下: GameView.h #import...,这里有一点需要主要,在4个方向进行递归查找时,理论上每个方向只需要单面递归即可,但是代码中采用了双面递归在进行累加方式,这样设计可以遍历更少棋子判定出胜负情况。...四、整合通讯与游戏逻辑    创建一个继承于UIViewController作为游戏视图控制器,实现如下: GameViewController.m #import "GameViewController.h...附录:游戏源码已经放在git上,时间比较仓促,只用了一下午来写,其中还有许多细节与bug没有进行调整,有需要可以作为参考: git地址:https://github.com/ZYHshao/BlueGame

    79530

    Python面向对象编程Day 26部分

    五大数据类型:整型、字符串、列表、元组、字典 多态 多态概念指出了对象如何通过他们共同属性和动作来操作和访问,而不需考虑他们具体、多态表明了动态(又名:运行时)绑定存在,允许重载及运行时类型确定和验证...多态继承改变和扩展实现机制,即调用不同实例化得对象下相同方法,实现过程不一样。 (python中标准类型就是多态概念一个良好示范) 封装 本质要明确区分内外。...python会给双下划线开头变量重命名(前加上'_ClassName')   第一个层面的封装:就是麻袋,这本身就是一种封装   第二个层面的封装:中定义私有的,只在内部使用,外部无法访问(停留在约定层面...value)设置时触发  函数内self.key=value这样会触发无限递归  应该这样设置self....授权过程即所有更新功能都是由新某部分处理,但已存在功能就授权给对象默认属性。 包装通过继承加派生实现。 实现授权关键点就是覆盖__getattr__方法。

    42730
    领券