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

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

本篇文章探讨一下python几个概念:协议 、鸭子类型 、 抽象 、混入。 一、协议 在python中,协议是一个或一组方法。...通过输出结果就能看出,Eg1对象可以计算长度,也可以循环处理,这和正常序列没什么不同。因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应协议,不关注它类型。...注意,自己定义抽象要继承 abc.ABC(abc.ABC 是 Python 3.4 新增python2语法不是这样)。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象关联起来叫做虚拟子类,虚拟子类不会继承注册抽象,而且任何时候都不会检查它是否符合抽象接口...好了,了解了这些概念对于python使用和源码阅读是非常有用。希望能对你帮助!

1.8K20

子类可以继承到父注解--结论了

子类可以继承到父注解?...子类继承了这个父,分别: 子类方法,实现了父抽象方法 子类方法,继承了父方法 子类方法,覆盖了父方法 MyAnnotation自定义注解 ---------------------...抽象方法,没有继承到父抽象方法中Annotation 子类继承父doExtends方法,继承到父doExtends方法中Annotation,其信息如下:父doExtends方法 子类覆盖父...否 能 子类方法,实现了父抽象方法,这个方法能否继承到注解? 否 否 子类方法,继承了父方法,这个方法能否继承到注解? 能 能 子类方法,覆盖了父方法,这个方法能否继承到注解?...不能控制方法上注解是否可以被继承。

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

绑定子类泛型,反模式?

今天要说主题正是基于LayerSupertype,并结合了泛型技术而实现,同样,它还有一个重要约定:泛型类型参数必须是最终子类。...基于这个代码重用,使得子类代码非常简单。这里和普通继承、普通泛型不同点在于父在运行时绑定了具体子类类型。 设计原理     为什么要这样设计?为什么不直接使用非泛型呢?...要解决这个问题,我们需要把需要进行再继承也提取为一个泛型和一个继承此子类。...* 要不就是所有的都直接写成一个泛型+一个空子类方法。(这个设计丑陋?)...* 没有解决根本问题:TopArticle 并不是一个 Article,它只是一个和Article重用代码而已。

96550

python抽象

与jvm上语言不一样,python语言没有interface关键字,而且除了抽象,每个都有相应接口:实现或继承公开属性(方法或数据类型) 在定义里,受保护属性和私有属性不在接口中:即便...__setitem__ = setitem shuffle(a) 9 19 10 setitem参数名只是约定一样,只不过python会往里面传参数方法本质上也只是一个函数而已。...“鸭子类型”:忽略对象真正类型,转而关注对象有没有实现所需方法,签名和语义。 继承抽象很简单,只要实现python特殊方法__len__之类,这样python就会自动识别。...抽象继承大多都是在collections模块,现在打开这个模块文档看看。...,一共有16个,分为三层: --顶层是Iterable,Container,Sized,Callable,Hashable: 其中Iterable,Container,Sized是各个集合该继承三个抽象

86110

python 定义可选参数

问题 你想定义一个元,允许定义时提供可选参数,这样可以控制或配置类型创建过程。...解决方案 在定义时候,Python允许我们使用 [](https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p15_define_metaclass_that_takes_optional_arguments.html...def read(self, maxsize=None): pass @abstractmethod def write(self, data): pass 然而,在自定义元中我们还可以提供其他关键字参数...通过使用强制关键字参数,在创建过程中我们必须通过关键字来指定这些参数。 使用关键字参数配置一个元可以视作对变量一种替代方式。...另外,它们在 __prepare__() 方法中是可以被访问,因为这个方法会在所有主体执行前被执行。 但是变量只能在元 __new__() 和 __init__() 方法中可见。

1.7K20

【BAT面试题典】子类可以继承到父注解

子类重写父方法后,可以继承方法上注解?...这个不急,让我来分析一下,假设有如下注解: 定义被注解 子类直接继承父 获取父子类和方法注解信息,并输出注解value属性值 日志输出 可见子类子类方法,无法自动继承父和父方法上注解...如果带注解元素是方法,则在超中搜索方法 如下俩方法其实也很相像,何区别呢?...等注解支持继承?...我们通常controller,都会使用controller注解,如果可以被继承的话,Spring就不会只让我们使用Controller注解了,会提供另一种方式注入Controller组件,就是继承BaseController

66810

Python_子类调用父方法

注意一点,在子类内部通过继承方式调用父属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例在通过继承调用父属性或方法时...该部分代码块如下:注意一点,在子类内部通过继承方式调用父属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例在通过继承调用父属性或方法时...与student.eat区别 student.done() 此时如果父名称更改了,那么在子类中所有用到父地方均要进行修改了。...使用super好处,一是可以代替父名,这样后期父名更改了,我们只需要更改子类名称后面的父名即可,子类中其他可以不用更改;二是使用了super后,调用父方法时可以不传参数self。...__init__(name,age,sex) #通过子类参数传给父,用super可以省略self self.classnaem = classnaem def course

4.8K20

date和calendar区别_java可以定义

System.out.println(d1); 使用带参数构造方法,可以构造指定日期Date对象,Date中年份参数应该是实际需要代表年份减去1900,实际需要代表月份减去1以后值。...Calendar是一个抽象,在实际使用时实现特定子类对象,创建对象过程对程序员来说是透明,只需要使用getInstance方法创建即可。...如果只设定某个字段,例如日期值,则可以使用如下set方法: public void set(int field,int value) 在该方法中,参数field代表要设置字段类型...get方法可以获得Calendar对象中对应信息,get方法声明如下: public int get(int field) 其中参数field代表需要获得字段值,字段说明和上面的...如发现本站涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

1.2K20

Python抽象定义与使用

我们写Python基本不需要自己创建抽象,而是通过鸭子类型来解决大部分问题。《流畅Python》作者使用了15年Python,但只在项目中创建过一个抽象。...定义抽象子类 先回顾下什么是抽象Python抽象是指必须让继承它子类去实现它所要求抽象方法。...抽象子类必须覆盖抽象方法(普通方法可以不覆盖),可以使用super()函数调用抽象方法,为它添加功能,而不是从头开始实现 再看白鹅类型 白鹅类型定义一点难以理解,如果理解了虚拟子类,就能加快理解白鹅类型...虚拟子类并不是抽象真正子类,而是注册到抽象子类,这样Python就不会做强制检查了。...白鹅类型和鸭子类型是Python动态特性,它们共同点是,只要长像,Python就不会做强制检查,鸭子类型是针对普通子类而言,白鹅类型是针对抽象虚拟子类而言

1.9K30

python 子类调用父构造函数实例

子类继承父后,需要调用父方法和属性时,需要调用父初始化函数。...super函数返回一个super对象,解析过程自动查找所有的父和父,当前和对象可以作为super函数参数使用,调用函数返回方法是超方法。...使用super函数如果子类继承多个父只许一次继承,使用一次super函数即可。 如果没有重写子类构造函数,是可以直接使用父属性和方法。..., python3 中直接 super().init() 中 super 不需要传递任何参数,直接可以调用父构造方法 python2 中 super(Consumer, self).init(),...以上这篇python 子类调用父构造函数实例就是小编分享给大家全部内容了,希望能给大家一个参考。

3.5K30

Python更牛语言?看我用元(metaclass)花式创建Python

Python定义再简单不过了。不过你想过动态定义一个Python?What?动态定义,是动态解析Python代码?不,这仍然是静态定义。....Foo object at 0x10e905438> 尽管这段代码可以根据choose_class函数参数值返回不同Python,但这并不是动态,因为仍然必须自己编写整个。...使用class关键字时,Python会自动创建此对象。但是,与Python大多数事情一样,它为您提供了一种手动进行操作方法。 还记得type函数?该函数可以让你知道对象类型。...type函数可以描述作为参数,并返回一个。 好吧,类型具有完全不同能力,它也可以动态创建。type可以描述作为参数,并返回一个。...自定义元(metaclass) 我们还可以自定义元,一个元可以是一个函数,函数参数与type函数相同。现在给出一个使用元例子。

78220

Python接口协议和抽象

猴子补丁 我们可以通过猴子补丁来进一步认识,Python中协议约定是怎么回事。猴子补丁是这样一种技术:在运行时修改或模块,而不改动源码。...抽象 Python抽象是指必须让继承它子类去实现它所要求方法。...Pythoncollections.abc模块中就定义了很多抽象: 虽然我们在实际编程中并不会自己编写抽象(一般也不建议这样做,因为可能会导致意想不到问题),但是了解抽象可以帮助我们更好理解...白鹅类型是指只要cls是抽象(即cls是abc.ABCMeta),就可以使用isinstance(obj, cls)。它基本特性是,即便不继承,也有办法把一个注册为抽象虚拟子类。...Python不会检查虚拟子类是否实现了抽象要求实现方法,而是由我们自己保证,并捕获异常。具体会在下篇文章《Python抽象定义与使用》进行介绍。

1.6K30

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

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

20130

动态调用方法(无)(参数

1、Type,方法用Invoke调用时候就 使用null:表示该方法是无参数 2、Type,方法用Invoke调用时候就 使用new object[] { "肖名" }传递参数:表示该方法是参数...= tp.GetMethod("Say");//2、调用这个Say方法,,注意:没有参数!!!...(obj, null); // 当在派生中重写时,调用具有给定参数反射方法或构造函数。...////5、也就是说,调用方法Say(),是没有参数,那么在用Invoke调用时候就 使用null:表示该方法是无参数 ////3、先写上一个括号,发现,第一个参数是object...new object[] { "肖名" }传递参数:表示该方法是参数 Type tp = typeof(Person); MethodInfo meth

2.6K20

说说Pythonself参数

小猿会从最基础面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己意见和讨论,大家是要一起学习 。...废话不多说,开始今天题目: 问:说说Pythonself参数? 答:在Python中规定,函数第一个参数是实例对象本身,并且约定俗成名字写为self。...等价于C++中self指针和Java、C#中this参数。表示当前对象,可以调用当前属性和方法。 首先明确是self只有在方法中才会有,独立函数或方法是不必带有self。...self在定义方法时是必须有的,虽然在调用时不必传入相应参数。...推荐大家看一篇文章: https://blog.csdn.net/qq_41621362/article/details/85805481 如果对于参考答案不认同,大家可以在评论区指出和补充,欢迎留言

90140

Python实现子类调用父初始化实例

前言 python中进行面向对象编程,当在子类实例中调用父属性时,由于子类__init__方法重写了父__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。...这时候就需要在B__init__方法中先执行A__init__方法,脚本才可以正确执行。Python提供了两种方法来完成这个任务。...方法一: 调用未绑定__init__方法 在方法定义时,首个参数均为self。当实例化这个时,self就被自动绑定到当前实例。绑定也就意味着这个实例属性,方法都可以通过‘self....***方式进行调用。但是如果通过名直接调用方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定实例上。也就是子类实例上,在这里就是B了。...以上这篇Python实现子类调用父初始化实例就是小编分享给大家全部内容了,希望能给大家一个参考。

1.9K20
领券