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

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

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

1.9K20

绑定子类的泛型,反模式?

基于这个的代码重用,使得子类的代码非常简单。这里和普通继承、普通泛型的不同点在于父在运行时绑定了具体子类的类型。 设计原理     为什么要这样设计?为什么不直接使用非泛型的呢?...这是为了在实现的通用方法中,能够以强类型的方式直接访问最终的子类。...再举一个例子:由于泛型运行时绑定了不同的子类,使得它本身的静态字段绑定到最终的子类中的。...无法向转换。     这个问题产生的原因,主要是因为没有一个“子类无关的抽象”存在。...要解决这个问题,我们需要把需要进行再继承的也提取为一个泛型和一个继承此的空的子类

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

    PHP 子类重写父成员详解 overwrite

    重写规则 ---- 一、重写的成员访问权限不能低于父 二、 重写的成员是不是静态成员必须和父保持一致 三、重写方法时,参数类型必须保持一致,参数数量可多不可少,默认值可多不可少 2....重写的成员访问权限不能低于父 ---- 致命错误:用户::$name的访问级别必须是public(如在class Base中),位于E:\www\1.php的第15行 Fatal error: Access...重写的成员是不是静态成员必须和父保持一致 ---- 致命错误:无法在E:\www\1.php的第15行将非静态属性 name重新声明为静态属性 name Fatal error: Cannot redeclare...方法参数数量大于父方法参数数量时, 参数必须有默认值 ---- 警告:User::main(intid,stringname)的声明应与E:\www\1.php第16行中的Base::main(int...父方法参数有默认值时, 子类方法必须也有默认值 ---- 警告:User::main(stringname)的声明应与E:\www\1.php第15行中的Base::main(stringname=’

    2K50

    PHP面向对象程序设计子类扩展父子类重新载入父)操作详解

    本文实例讲述了PHP面向对象程序设计子类扩展父子类重新载入父)操作。...分享给大家供大家参考,具体如下: 在PHP中,会遇到这样的情况,子类继承父,但是又需要对父的属性和方法进行一定的扩展,这时子类可以对属性和方法进行重写,覆盖父类同名的属性和方法,但是如果父的方法中的内容比较多...重写方法访问权限 在子类覆盖父的方法时要注意,在子类中重写的方法的访问权限一定不能低于父被覆盖的方法的访问权限。...总之在子类中重写父的方法时,一定要高于父被覆盖的方法的权限。 重写时的参数数量 子类可以拥有不同的参数数量,如下面的构造方法中,多添加了一个参数$age。 <?...相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算运算符用法总结》、《php字符串(string

    93720

    c++-派生

    虚函数在重新定义时参数的个数和类型必须和中的虚函数完全匹配,这一点和函数重载完全不同。...覆盖(Override)是指派生中存在重新定义的函数,其函数名、参数列、返回值类型必须同父中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体 (花括号中的部分)不同,当派生对象调用子类中该同名函数时会自动调用子类中的覆盖版本...覆盖的特征有: 不同的范围(分别位于派生);2) 函数名字相同;3) 参数相同;4) 函数必须有virtual关键字。...隐藏是指派生的函数屏蔽了与其同名的函数,规则如下: 如果派生的函数的函数同名,但是参数不同。此时,不论有无virtual关键字,的函数将被隐藏(注意别重载混淆)。...2) 如果派生的函数的函数同名,并且参数也相同,但是函数没有virtual关键字。此时,的函数被隐藏(注意别覆盖混淆)。

    38820

    C# 在定义好方法让子类继承接口就能实现

    在 C# 里面,接口的定义只需要里面存在和接口声明相同的方法或属性就可以,而存在的方法或属性是在子类定义的还是里面定义的都无所谓。...也就是在里面写好了方法,但不继承接口,等子类继承接口的时候就不需要子类实现方法。...通过这样的方法可以在里面添加一些辅助方法,而这些方法默认不给子类开启,除非子类继承了接口 在定义的方法,如果在子类继承的接口里面声明的方法刚好和定义的相同,那么子类可以不需要再次定义。...在可以判断当前自己的类型是否继承了接口 这个方法用在里面期望在特定的代码里面给子类暴露一些内部的方法,但是又不能让子类随意调用。...,同时因为子类继承了预期接口而能使用 这就是通过在里面定义好方法和定义好代码逻辑,只要子类继承接口才能实现

    58720

    5.1 、超子类

    5.1 、超子类   子类比超拥有的功能更加丰富。   在本例中,Manager类比超Employee封装了更多的数据,拥有更多的功能。   ...在通过扩展超定义子类的时候,仅需要指出子类和超的不同之处,因此,会将通用的方法放在超中,而将具有特殊用途的方法放在子类中,这种将通用的功能放在超的方法,在面向对象程序设计中十分普遍。   ...如果在所有名为f的方法中存在一个提供的参数类型完全匹配,就选择这个方法这个过程被称为重载解析(overloading resolution)。...(4)程序运行而且采用动态绑定调用方法的时候,虚拟机一定调用x所引用对象的实际类型最合适的那个的方法。...5.1.6 抽象 位于上层的更具有通用性,甚至可能更加抽象。从某种角度看,祖先更加通用,人们只将它作为派生其他,而不作为想使用的特定的实例。 ?

    1.1K90

    PHP面向对象-子类对父成员的访问(一)

    PHP面向对象编程中,子类可以继承父的属性和方法,并且可以访问和修改它们。子类可以通过继承和覆盖父的方法来实现自己的行为,也可以通过调用父的方法来扩展父的行为。...访问继承的属性子类可以继承父的属性,并且可以使用它们来实现自己的行为。子类可以访问继承的属性,包括公共、保护和私有属性。...然后我们定义了一个Dog,它继承自Animal,并添加了一个bark()方法。我们创建了一个Dog对象,并使用继承的getInfo()方法访问了父的属性。...在子类中,我们使用parent::__construct()方法调用父的构造函数来设置继承的属性。在子类中,可以访问继承的公共和保护属性,但不能直接访问继承的私有属性。...如果需要访问继承的私有属性,可以在父中添加一个公共的访问器方法。

    1.2K20

    View

    View Django 视图的核心就是这个,这个是所有其它视图的,它定义所有视图共有的初始化逻辑,以及一些共有的方法,以便其它视图继承。...,至于其它需要处理的 HTTP 方法如 post、get 等方法则由 View 的子类根据其具体功能实现。...View ),是不是和你直接在这里放一个视图函数是一样的?...但是像上述这种函数分离的实现方式很麻烦且不优雅,直接把 view 定义在里,就是 Django 视图的实现方式了。... View 定义了所有视图的基本逻辑框架,接下来我们会继续分析一系列基于这个 View 定义的更加具体的通用视图。 如果遇到问题,请通过下面的方式寻求帮助。 在下方评论区留言。

    90350

    PHP面向对象-子类对父成员的访问(二)

    访问继承的方法子类可以继承父的方法,并且可以覆盖它们以实现自己的行为。子类可以调用继承的方法,包括公共、保护和私有方法。...然后我们定义了一个Dog,它继承自Animal,并添加了一个公共的bark()方法、一个公共的walkAndBark()方法和一个公共的eat()方法。...在Dog中,我们调用了继承的walk()方法,并且使用$this->语法调用了自己的bark()方法。我们还覆盖了继承的eat()方法,以实现自己的行为。...在子类中,可以调用继承的公共和保护方法,但不能直接调用继承的私有方法。如果需要调用继承的私有方法,可以在父中添加一个公共的调用器方法。在子类中,还可以覆盖继承的方法以实现自己的行为。...在覆盖方法时,可以使用parent::语法调用父的方法。在上面的示例中,Dog覆盖了继承的eat()方法,并使用echo语句输出了自己的行为。

    91750

    子类,多态,上转型,下转型

    ; } public void usePareStaticThink(){ super.think(); //子类方法调用父静态方法 } } 写一个main...parent=new SuperClass(); ChildClass child=new ChildClass(); ChildClass.think(); //1.子类可直接调用父方法...child.say(); //2.子类方法重写并调用父方法 child.go(); //3.子类对象可以调父的非静态方法...child.think(); //4.子类对象可以调父的静态方法 child.usePareStaticThink(); //5.子类方法可以调用父静态方法(用super...我是父说! 我是子类说! 我是父走! 我是静态的,父想! 我是静态的,父想! 向上转型(多态): 我是父说! 我是子类说! 我是静态的,父想! 我是静态的,父想!

    18710

    C++虚拟继承

    多重继承使得派生的关系变得更为复杂,其中一个容易出现问题是某个沿着不同的路径被派生继承(即形成所谓“菱形继承”),从而导致一个派生对象中存在同一个对象的多个拷贝。...(1)当在多条继承路径上有一个公共的,在这些路径中的某几条汇合处,这个公共的就会产生多个实例(或多个副本),若只想保存这个的一个实例,可以将这个公共说明为虚,就像Student和Employee...(2)被虚拟继承的,叫做虚。虚实际指的是继承的方式,而非一个,是动词,而非名词。 (3)为了实现虚拟继承,派生对象的大小会增加4。...这个增加的4个字节,是因为当虚拟继承时,无论是单虚继承还是多虚继承,派生需要有一个虚表来记录虚继承关系,所以此时子类需要多一个虚表指针,而且只需要一个即可。...(4)虚拟继承中,虚对象是由最远派生的构造函数通过调用虚的构造函数进行初始化的,派生的构造函数的成员初始化列表中必须列出对虚构造函数的调用;如果未列出,则表示使用该虚的缺省构造函数。

    90220

    Python抽象的定义使用

    我们更多时候是创建现有抽象子类,或者使用现有的抽象注册。...本文的意义在于,了解抽象的定义使用,可以帮助我们理解抽象是如何实现的,为我们以后学习后端语言(比如Java、Golang)打下基础。毕竟抽象是编程语言通用设计。...定义抽象子类 先回顾下什么是抽象:Python的抽象是指必须让继承它的子类去实现它所要求的抽象方法的。...虚拟子类并不是抽象的真正子类,而是注册到抽象上的子类,这样Python就不会做强制检查了。...白鹅类型和鸭子类型是Python的动态特性,它们的共同点是,只要长的像,Python就不会做强制检查,鸭子类型是针对普通子类而言的,白鹅类型是针对抽象的虚拟子类而言的。

    2.1K30

    【Python】面向对象 - 继承 ② ( 子类重写父成员 | 子类调用父重名成员 | 子类中使用 父名 调用父成员 | 子类中使用 super 调用父成员 )

    一、子类重写父成员 1、子类重写父成员语法 子类 继承 父的 成员属性 成员方法 后 , 如果对 继承的 父成员 不满意 , 可以 重写 父成员 ; 成员 属性 和 成员 方法 , 都可以进行重写...; 成员属性 重写 , 就是在 子类中 , 修改 成员属性的值 ; 成员方法 重写 , 就是在 子类中 , 修改 成员方法的方法体内容 ; 在子类中 , 如果需要重写父的成员 , 直接在子类中 ,...- 子类重写父成员 在父 Animal 中 , 定义了 成员属性 name 和 age , 成员方法 make_sound 函数 ; 在子类 Dog 中 , 对 父 Animal 的 成员属性 name...1、子类调用父重名成员语法 在 外部 是无法访问 父成员 : 子类 重写 父 成员后 , 通过 子类 实例对象 调用 该 重写后的 成员时 , 默认调用的就是 重写后的成员 ; 在 子类内部 可以...) 2、代码示例 - 子类中使用 父名 调用父成员 在 Dog 子类中的 make_sound 函数中 , 通过 Animal.name 和 Animal.age 可以调用父的成员变量 , 打印出来的值为父的成员变量值

    59730

    PHP对象

    ->attr; }} // 方式一$obj = new Test();$obj->foo(); // 方式二// 可变函数类似,称为可变吧$className = 'Test';$obj...要创建一个新实例必须使用克隆操作的属性和方法存在不同的空间,所以同一个的属性和方法可以使用同样的名称使用extends实现继承,PHP只支持单继承。::class名解析<?...extends A{ const ATTR_1 = 6; // 可以在子类中重定义}的自动加载推荐使用spl_autolad_register()来注册自动加载器,可以注册任意多个__autolad...::抽象任何一个,如果它里面至少有一个方法是抽象的,那么这个就必须被声明抽象的抽象也可以实现接口接口接口也可以使用extends来扩展也可以定义常量,PHP8.1之前不能被子类或子接口覆盖Trait...extends A { public static function who() { echo __CLASS__; }}B::test(); // Output: B协变逆变协变使子类比父方法能返回更具体的类型逆变使子类比父方法参数类型能接受更模糊的类型

    1.6K10

    一个简单的方法:截取子类名称中不包含后缀的部分

    是 MenuItem,子类是 WalterlvMenuItem、FooMenuItem。...是 Configuration,子类是 WalterlvConfiguration、ExtensionConfiguration。...在代码中,我们可能会为了能够一眼看清之间的继承(从属)关系而在子类名称后缀中带上的名称。但是由于这种情况下的不参与实际的业务,所以对外(文件/网络)的名称通常不需要带上这个后缀。...本文提供一个简单的方法,让子类的后缀删掉,只取得前面的那部分。 在这段代码中,我们至少需要获得两个传入的参数,一个是的名称,一个是子类的名称。...derivedTypeName : name; } } } 我们通过判断子类是否以名称作为后缀来决定是否截取子字符串。

    22730
    领券