image.png #思特沃克好声音# (图片:网络) 在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子”。 从鸭子类型,我们可以联想到它的推导,并不在乎类型的真正实体,只要他的行为有鸭子的特性,那么我们就可以把它当做一只鸭子来看到。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。 鸭子类型在动态语言中被广为奉行。某类接
多态性允许将父对象设置成为和一个或多个它的子对象相等的技术,比如Parent~Child,多态性使得能够利用同一类(基类)类型的指针来引用不同类(子类)的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作
“字典这个数据结构活跃在所有Python程序的背后,即便你的源码里并没有直接用到它”,摘抄自《代码之美》第18章Python的字典类:如何打造全能战士。字典是Python语言的基石!在函数的关键字参数、实例的属性和模块的命名空间都能够看到它的身影,我们自己写代码时也经常会用到。
以前写过一篇文章讲了一下python中的多态,最后得出结论python不支持多态,随着对python理解得加深,对python中得多态又有了一些看法。
TypeScript 是一种基于 JavaScript 的静态类型语言,它为 JavaScript 添加了类型系统,并提供了强大的类型检查和自动补全功能。TypeScript 的类型系统有一个非常重要的特性,那就是 "鸭子类型"(Duck Typing)或 "结构化类型"(Structural Typing)(文章会以"鸭子类型"(Duck Typing)作为简称)。这种特性有时会让人感到惊讶,但它是 TypeScript 增强 JavaScript 开发体验的重要方式之一。
对于鸭子模型常见的说法是:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
”面向接口编程“写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性、维护性谁都不能拒绝。
在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。
大家好,我是 ConardLi,今天我们一起来看一个 TypeScript 中一个有趣的知识点 - 鸭子类型(Duck Typing)。
就在上周,TypeScript 合并了一个 PR(https://github.com/microsoft/TypeScript/pull/57465):
简单来说,多态是指同一个方法或操作符在不同的对象实例上可以有不同的行为。这意味着可以通过一个共同的接口或基类引用不同的子类对象,并根据实际的对象类型来调用相应的方法。
在生活里,我想买个水龙头,但是我不知道家里的管子多粗,我只需要给老板说买个普通的,回家去安装,发现正好。这里面就定义的接口的标准,通常水龙头接口和高压水管的接口都是固定的,这样外界才能更好的去配合标准工作。
面向对象编程关乎接口。在 Python 中理解类型的最佳方法是了解它提供的方法——即其接口——如 “类型由支持的操作定义”(第八章)中所讨论的。
我们写Python基本不需要自己创建抽象基类,而是通过鸭子类型来解决大部分问题。《流畅的Python》作者使用了15年Python,但只在项目中创建过一个抽象基类。我们更多时候是创建现有抽象基类的子类,或者使用现有的抽象基类注册。本文的意义在于,了解抽象基类的定义与使用,可以帮助我们理解抽象基类是如何实现的,为我们以后学习后端语言(比如Java、Golang)打下基础。毕竟抽象基类是编程语言通用设计。
与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型)
有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍?
一句话:“当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也想鸭子,那么这只鸟就可以被称为鸭子。”,也就是我并不关心对象什么类型,到底是不是鸭子,只关心行为。
首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。
本文主要介绍如何用python的鸭子类型的实现方式,用魔法函数来实现自定义类,想歪的同学快出去面壁思过,所需基础可参考本公众号之前的文章。
我们在之前说过,「封装」「继承」 和「多态」是 OOP 的重要特征,前面我们已经讲过了继承,今天我们来学习的是 “多态”。这里更多的是针对初学 Python 的读者谈谈如何去理解 “多态”,因为「多态」就如同它的名字一样,在理解上也是「多态」的,算是各有千秋。建议各位在看完本篇文章以后,也要多 Google 一下相关的内容再加深理解。
在使用Promise时,一个很重要的细节是如何确定值是不是真正的Promise,或者说它是不是一个行为方式类似于Promise的值?
小王公司要开发一个养鸭子的模拟养育游戏。游戏中会出现各种类型的鸭子。小王设计了一个基础的鸭子类——Duck类,这个类有3个方法:
Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已。
问起面向对象的三大特性,几乎每个人都能对答如流:封装、继承、多态。今天我们就要来说一说 Python 中的多态。
Python,看似简单的语言背后,隐藏着一些令人惊叹的黑科技。这些技术不仅使得Python成为一个强大的工具,同时也展示了其设计者对灵活性和创造力的深刻理解。在这篇文章中,我们将探索一些Python的神秘面纱,揭示它背后的黑科技。
所谓类型检查机制,就是编程语言编译器在做类型检查时,所秉持的原则,以及表现出的行为。
Python 中的函数是一等对象。编程语言研究人员将“一等对象”定义为一个程序实体,可以:
在本教程中,我们将学习鸭子类型。这是 Python 中的一个流行术语,来源于这样一句话:“如果它走路像鸭子,游泳像鸭子,看起来像鸭子,那么它很可能应该是一只鸭子。”
翻译过来就是:如果某个东西长得像鸭子,游泳像鸭子,嘎嘎叫像鸭子,那它就可以被看成是一只鸭子。
在 Python 中如何编写一个自定义的字典类?大家可能被告诉要使用collections.abc中的类作为基类而不是dict。dict也不是任何时候都不能做基类——当你没有重载任何内建方法时可以直接继承dict。
继承作为面向对象的三大要素(封装、继承、多态)之一为什么会带来问题,问题如何解决然后形成一种设计模式,head frist设计模式书中以鸭子作为例子讲解什么情况下继承的方式会带来问题。首先有各种各样的鸭子,那么自然想到各种鸭子继承自一个父类:父类为Duck,现有绿头鸭GreenHeadDuck和红头鸭RedHeadDuck
封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现,外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程序在使用某一对象时不需要关心该对象的数据结构细节及实现操作的方法。使用封装能隐藏对象实现细节,使代码更易维护,同时因为不能直接调用、修改对象内部的私有信息,在一定程度上保证了系统安全性。类通过将函数和变量封装在内部,实现了比函数更高一级的封装。
多态(polymorphism),是OOP的一个重要概念。不少学习或使用 Python 的人,特别他们曾经了解过 Java 之后,对 Python 中的多态往往有不同的解读。为了避免因人微言轻,在本节将更多地引述一名权威对 Python 语言的多态的阐述,这位大神就是《Thinking in Java》的作者 Bruce Eckel ——将 Java 奉为圭皋的特别注意,这位可真是大神,如果学习 Java 而没有阅读他的书,借用 Java 界的朋友所说,“那就不算学过 Java”。
多态(Polymorphism),是OOP的一个重要概念。不少学习或使用 Python 的人,特别也曾经了解过 Java 的,就会对 Python 中的多态有不同的解读。为了避免人微言轻,在本节将引述一名权威对 Python 语言的多态的阐述,这位大神就是《Thinking in Java》的作者 Bruce Eckel ——将 Java 奉为圭皋的特别注意,这位可真是大神,如果学习 Java 而没有阅读他的书,借用 Java 界的朋友所说,“那就不算学过 Java”。
Python语言是没有interface关键字的,这也是动态类型语言的特点之一。Python的接口指的是类实现或继承的公开属性,包括数据或方法。比如Sequence的正式接口如下图所示:
TypeScript里的类的定义与ES6 Class规范一致,静态属性,实例属性,访问器等都支持:
在Python编程世界中,有一种特殊的类型,被戏称为“鸭子类型”。这个概念源自一句格言:“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子。” 这种理念在Python中得以充分体现,它让我们在编写代码时更加关注对象的行为,而不是对象的类型。本文将深入探讨鸭子类型在Python中的应用,以及如何利用这一特性编写更加灵活、可复用的代码。
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。策略模式(Strategy Pattern)属于行为型模式,其做法是将类所需的行为或者算法一个个封装成单独的类,并将其作为类的数据成员,使得类的行为可以在不改变类设计的情况下灵活变化。
这次文章依然很长,基本上涵盖了 interface 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天。洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如文章里没有写到反射,当然,后面会单独写一篇关于反射的文章,这是后话。
协议是接口,但不是正式的,因此协议不能像正式接口那样施加限制。一个类可能只实现部分接口。
any和all的功能和简单,却更容易重写你的逻辑片段,使其更加Pythonic。它们接收一个迭代器,其中元素为布尔值。就像名字一样,all只有在全为真的时候返回True,而any只要有一个为真就返回True。
将可变的部分 从程序中抽象分离成算法接口在该接口下分别封装一系列的算法实现 并使他们可以相互等候,从而导致客户端程序独立于算法的改变。
本文发表于知乎专栏:https://zhuanlan.zhihu.com/p/78333162
由于 Python 数据模型,您定义的类型可以像内置类型一样自然地行为。而且这可以在不继承的情况下实现,符合鸭子类型的精神:你只需实现对象所需的方法,使其行为符合预期。
从去年10月份开始学习 Python,到现在也1年了,从刚开始的学会了些简单Python 语法,到现在已经熟悉了 Python 编程,正在像熟练掌握Python进阶,之前也写过两篇 Python 学习的博客( Python 基本教程和 Python 函数学习),但是由于服务器崩溃的原因,导致遗失了。
首先创建一个 Animal() 父类,父类继承自 object,object 是所有类都会继承的类:
有一类面试官特别讨厌,面试的时候,会问一些偏、难、怪的题目。假设你今天去面试,遇到面试官问你:“什么是鸭子类型?”。你怎么回答?
这就是变量的多态;另外当m调用__init__方法时输出的内容和Human的__init__是不一样的,这就是多态之函数的多态。
本周的内容主要是做了一些继承相关的实现工作,把项目文件结构好好修了一波,还有就是加了一些测试。本周代码我觉得大多比较简单,很多地方就不过多赘述了。关于parser和ast在之前已经写好了,所以就直接进入代码生成和VM的部分
领取专属 10元无门槛券
手把手带您无忧上云