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

Python:多态、协议和鸭子类

对于多态,Python 有更好实现方式——鸭子类型(duck typing)。 协议和鸭子类型 所谓 鸭子类型 就是:如果一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是鸭子。...这个概念名字来源于 James Whitcomb Riley 提出鸭子测试。 初次看到这个描述小伙伴一定一头雾水,为了理解鸭子类型,我们不得不提到另一个名词——协议。...翻译成人话,就是:Python 中没有接口,在需要使用接口地方,就用协议代替。所谓协议,其实就是一组方法,和接口中定义方法一个意思。...用“鸭子类型”来实现策略模式也很简单,删掉抽象基类就可以了。(这就是为什么抽象基类很少使用原因,因为删掉代码也一样正确啊。)有兴趣小伙伴可以自己尝试一下代码。...Python 中协议举例 Python 中有很多协议,比如迭代器协议,任何实现了 __iter__ 和 __next__ 方法对象都可称之为迭代器,但对象本身是什么类型不受限制,这得益于鸭子类型。

97520

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

本篇文章探讨一下python中几个概念:协议 、鸭子类型 、 抽象基类 、混入类。 一、协议 在python中,协议是一个或一组方法。...二、鸭子类型(duck typing) 多态一种形式,在这种形式中,对象类型无关紧要,只要实现了特定协议即可。...通过输出结果就能看出,Eg1对象可以计算长度,也可以循环处理,这和正常序列没什么不同。因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应协议,不关注它类型。...抽象方法使用 @abstractmethod 装饰器标记,而且定义体中通常只有文档字符串。...好了,了解了这些概念对于python使用和源码阅读是非常有用。希望能对你有帮助!

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

AtomicInteger、AtomicBoolean、AtomicLong等原子类使用

我们可以把这个操作符拆分开来看一下它实现逻辑。 ? 按照上面表达式count++要经历3个必要步骤: 首先要获取count值, 计算count+1值 在然后将计算后值赋值给count。...在回到我们刚刚说多线程问题上,如果同时有两个以上线程都执行count++操作,它们步骤就有可能是(多线程执行结果是不固定)线程一先获取到count值因为它是实例变量,所以JVM会初始化默认值也就是...下面我们看一下具有原子操作类AtomicInteger、AtomicBoolean、AtomicLong。这三个类方法使用都是一样,我们重点看一下AtomicInteger类使用。...它为我们提供了很多原子操作方法。具体如下: ? ? ? 这里面有很多支持原子操作方法,这里就不一一介绍了,具体使用时候可以查相关API文档。下面我们将详细介绍一下上面的3个方法。...get()作用是获取当前AtomicInteger类中值。然后将获取AtomicInteger类中值执行加1运算。

81030

(十七)AtomicInteger原子类介绍和使用

多线程系列目录: (一)线程是什么 (二)Java线程与系统线程和生命周期 (三)Java线程创建方式 (四)为什么要使用线程池 (五)四种线程池底层详解 (六)ThreadPoolExecutor自定义线程池...)ThreadLocal用法,如何解决内存泄漏 (十六)ReentrantLock可重入锁使用和介绍 (十七)AtomicInteger原子类介绍和使用 ---- 在第十四章(十四)volatile...简单说就是 count=count+1 执行时候,每次都要去读到count值(右边这个),然后再加一,然后在修改count值(左边),但就是恰恰这个修改时间,这10个线程执行顺序是CPU控制...Description */ public class AtomicIntegerTest extends Thread { // public static int count = 0; // 使用...原子类一览图参考如下: ? 上面例子用到是AtomicInteger,还有其他场景数据要求也可以使用合适子类

81440

Python 中使用私有成员子类

__value但是,当我们想要子类化一个类,并访问其私有成员时,却没有一种简单方法。通常,我们希望直接操作类中原始数据对象,而无需总是使用访问器和修改器。...虽然这似乎违背了私有和公有的基本思想,但通常情况下,我们要子类类是我们自己类,我们很乐意将成员公之于子类,但不想让该类实例访问这些成员。那么,有没有一种干净方法来实现这种区别呢?..._value = new_value在上面的例子中,我们使用 property() 函数定义了一个私有属性 _value,并通过 value 属性来访问和修改这个私有属性值。...代码例子以下是使用单下划线作为私有属性标记代码例子:class Parent: def __init__(self, value): self....然后我们创建了一个子类 Child,它继承了 Parent 类。在 Child 类中,我们定义了一个方法 access_private_value(),它可以访问和修改父类私有属性 _value。

7710

慧荣科技:MaxLinear通知无效,要求遵守合并协议约定!

7月28日,针对美国芯片厂商MaxLinear(迈凌)宣布放弃收购NAND闪存控制器厂商慧荣科技(Silicon Motion)一事,慧荣科技于28日发布声明回应称,MaxLinear通知无效,要求...慧荣科技称,在双方签署合并协议15个月期间,为获得各国主管机关(包括中国国家市场监督管理总局与其他主管机关)对本合并案核准,与MaxLinear共同合作,慧荣科技遵守协议约定所有义务,也未曾遭受任何重大不利影响...因此要求迈MaxLinear遵守合并协议约定义务,并准备从法律上积极行使合并协议所订权利。...MaxLinear表示,终止收购慧荣科技原因是:(1) 合并中规定某些完成条件协议未得到满足且无法满足;(2) 慧荣科技遭受了持续重大不利影响;(3) 慧荣科技严重违反了合并协议陈述、保证、契约和协议...,这些陈述、保证、契约和协议给予MaxLinear终止交易权利;(4) 第一个延长外部日期已经过去,并且不会自动延长,因为截至2023年5月5日,合并协议第 6 条中某些条件尚未得到满足或豁免。

15120

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

; 成员属性 重写 , 就是在 子类中 , 修改 成员属性值 ; 成员方法 重写 , 就是在 子类中 , 修改 成员方法方法体内容 ; 在子类中 , 如果需要重写父类成员 , 直接在子类中 ,...重新定义父类成员即可 ; 在 Python 中 , 不像 Java / Kotlin / Groovy 一样 , 如果子类重写父类成员 , 需要使用 @Override 注解 修饰 ; 2、代码示例...1、子类调用父类重名成员语法 在 外部 是无法访问 父类成员 : 子类 重写 父类 成员后 , 通过 子类 实例对象 调用 该 重写后 成员时 , 默认调用就是 重写后成员 ; 在 子类内部 可以...访问父类成员 : 如果需要调用被重写之前 父类成员 , 则需要使用如下方法 : 方法一 : 使用 父类类名 调用父类成员 ; 调用父类同名成员变量 : 父类类名.成员变量名 调用父类同名成员方法...) 2、代码示例 - 子类使用 父类类名 调用父类成员 在 Dog 子类 make_sound 函数中 , 通过 Animal.name 和 Animal.age 可以调用父类成员变量 , 打印出来值为父类成员变量值

33230

使用 EnumWindows 找到满足你要求窗口

在 Windows 应用开发中,如果需要操作其他窗口,那么可以使用 EnumWindows 这个 API 来枚举这些窗口。...本文介绍使用 EnumWindows 来枚举并找到自己关心窗口(如 QQ/TIM 窗口)。 ---- EnumWindows 你可以在微软官网了解到 EnumWindows。...使用我在另一篇博客中方法可以自动生成这样平台调用代码: 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名 我这里直接贴出来: 1 2 [DllImport...本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。...欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后作品务必以相同许可发布。

37420

Java知多少(53)使用Java创建自己异常子类

尽管Java内置异常处理大多数常见错误,你也许希望建立你自己异常类型来处理你所应用特殊情况。...这是非常简单:只要定义Exception一个子类就可以了(Exception当然是Throwable一个子类)。你子类不需要实际执行什么——它们在类型系统中存在允许你把它们当成异常使用。...当输出一个Throwable对象时,该方法被println( )调用 下面的例子声明了Exception一个新子类,然后该子类当作方法中出错情形信号。...MyException e) { 26 System.out.println("Caught " + e); 27 } 28 } 29 } 该例题定义了Exception一个子类...该子类非常简单:它只含有一个构造函数和一个重载显示异常值toString( )方法。ExceptionDemo类定义了一个compute( )方法。该方法抛出一个MyException对象。

29620

iOS开发中手势体系——UIGestureRecognizer分析及其子类使用

iOS开发中手势体系——UIGestureRecognizer分析及其子类使用 一、引言         在iOS系统中,手势是进行用户交互重要方式,通过UIGestureRecognizer类,...UIGestureRecognizer对象,而是通过其子类进行实例化,iOS系统给我们提供了许多用于我们实例子类,这些我们后面再说,我们先来看一下,UIGestureRecognizer中抽象出了哪些方法...1、统一初始化方法         UIGestureRecognizer类为其子类准备好了一个统一初始化方法,无论什么样手势动作,其执行结果都是一样:触发一个方法,可以使用下面的方法进行统一初始化...方法将不会被调用     UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  }; 3、常用属性和方法 //设置代理,具体协议后面会说...三、UIGestureRecognizerDelegate         前面我们提到过关于手势对象协议代理,通过代理回调,我们可以进行自定义手势,也可以处理一些复杂手势关系,其中方法如下: /

1.7K20

JavaAtomic原子类

Java SDK 并发包里提供了丰富子类,我们可以将其分为五个类别,这五个类别提供方法基本上是相似的,并且每个类别都有若干原子类。...如果需要对对象属性进行原子更像,那么可以使用原子化对象属性更新器。...如果我们仅仅在写回数据前判断数值是 A,可能导致不合理写回操作。AtomicStampedReference 和 AtomicMarkableReference 这两个原子类可以解决 ABA 问题。...相比原子化基本数据类型,原子化累加器速度更快,但是它(原子化累加器)不支持 compareAndSet() 方法。如果仅仅需要累加操作,使用原子化累加器性能会更好。...使用示例如下所示。在使用示例中,我们创建了一个 LongAccumulator 对象,初始值为1,累加函数为 (x, y) -> x y,即每次累加都将之前结果与新值相乘。

26830

一图说明各种开源许可使用要求

Apache Licence也是对商业应用友好许可。使用者也可以再需要时候修改代码来满足并作为开源或商业产品发布/销售。使用这个协议好处是:永久权利 一旦被授权,永久拥有。...比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码GPLGPL (GNU General Public License) :GNU通用公共许可协议。Linux 采用了 GPL。...GPL出发点是代码开源/免费使用和引用/修改/衍生代码开源/免费使用,但不允许修改后和衍生代码做为闭源商业软件发布和销售。...MIT与BSD类似,但是比BSD协议更加宽松,是目前最少限制协议。这个协议唯一条件就是在修改后代码或者发行包包含原作者许可信息。适用商业软件。...使用MIT软件项目有:jquery、Node.js。MIT与BSD类似,但是比BSD协议更加宽松,是目前最少限制协议。这个协议唯一条件就是在修改后代码或者发行包包含原作者许可信息。

1.1K30

创建子类对象时,父类构造函数中调用被子类重写方法为什么调用子类方法?

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父类会调用子类方法...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类方法,子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10
领券