问题标签 [duck-typing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4281 浏览

python - pygame 中用于 MVC 事件处理的 Python 鸭子类型

我和一个朋友一直在玩 pygame,偶然发现了这个使用 pygame构建游戏的教程。我们真的很喜欢它如何将游戏分解成一个模型-视图-控制器系统,其中事件作为中间人,但是代码大量使用了isinstance对事件系统的检查。

例子:

这会导致一些极其不合 Python 的代码。有人对如何改进有任何建议吗?或者实现 MVC 的替代方法?


这是我根据@Mark-Hildreth 回答编写的一些代码(我如何链接用户?)还有其他人有什么好的建议吗?在选择解决方案之前,我将把它打开一天左右。

这是使用来自@Paul 的示例的另一个构建 - 非常简单!

0 投票
2 回答
167 浏览

actionscript - Actionscript 鸭子打字

我正在覆盖子类中的受保护函数。

假设我有两个课程,Apple 和 Fruit。我有所有变量,这只是一个简化版本。

例子是微不足道的。问题是 getRandom 函数的类型取决于它自己的类型。一个返回一个苹果,另一个返回一个水果。当然,我会收到有关覆盖和强制的错误。

我试过返回一个水果而不是一个苹果,但是这个对象不是一个苹果,因此它没有苹果特定的属性。问题在于鸭子打字。我无法更改第三个类,它在每个对象上执行 getRandom() 函数,我需要 Apples 稍有不同。

如何覆盖 Apple 中的 getRandom 函数,使其返回苹果而不是水果?

0 投票
2 回答
224 浏览

ruby - Ruby 的开放式动态类结构(鸭子类型)是否安全?

我是一个新的 Ruby/Rails 开发人员,拥有多年的 Java 经验。这个“安全”问题是特定于 ruby​​ 的——而不是 rails——这就是为什么很难找到答案的原因,因为大多数 rails 安全问题都涉及 web 问题。

作为一名 Java 开发人员,我已经多次阅读 Effective Java。该书中提出的关键点之一是保护类中的数据和方法免受恶意用户的侵害。我的意思是:尽可能多地将代码私有化,使用不可变类并在返回对不可变对象的引用时使用防御性复制。您也可以使用 final 关键字。

但在 Ruby 中,一切都是开放的。当然,您可以将方法/数据设为私有,但作为 Ruby API 的使用者,有什么阻止我编写自己的方法版本,然后简单地(在运行时或代码中动态地)将其附加到类API?似乎 Effective Java 中讨论的所有安全性根本不适用于 Ruby。这只是从 Java 的思维转变吗?这不是 Ruby 或其他类似语言的“缺陷”吗?

0 投票
4 回答
156 浏览

c# - 我可以动态地像这样工作吗?

我有一个病人类:

我也有一个界面:

在这个控制台应用程序中,我希望 Display_Person 方法能够工作。它编译但抛出运行时错误,因为 Patient 没有实现 IPerson。

在没有 Patient 实现 IPerson 接口的情况下,我可以进行哪些代码更改以使 Display_Person 方法工作?我更喜欢可重复使用的解决方案。

更新:我希望它能够工作,这样我就可以获得智能感知。请看过去这个例子的琐碎性。它简短而准确地解释了我的问题。如果这是 1003 个贷款申请(打印时是一本书的大小),我不想将 20 多个接口应用到我的班级,以便我可以将相关数据分组以进行计算。我也不希望每次都输入所有这些属性。过去,智能感知的缺乏使我不再使用动态语言。(我不懒,我很有效率!)

0 投票
3 回答
103 浏览

algorithm - Pythonic 处理网络数据结构方法的方法

所以,关于什么是 Pythonic 的另一个问题!在这种情况下,应用程序领域是网络算法(如节点、边、Dijkstra 之类的东西......),我以前只用强类型语言编码过,我们可以非常确定一切都是什么。

同时在 Python 中,我有一个类Net;此类的单个实例代表一个网络。我有一个Edge为网络中的每个边缘实例化的类。Edge除其他外,每个实例都有一个唯一的id.

有时我希望通过引用相关Edge实例来删除边缘。其他时候我希望使用它的id. 老实说,我开始忘记哪些变量是Edges,哪些是ids. 我想我更喜欢 C++ 来完成这项工作:-P

所以我提出两个解决方案:

  1. 开始使用系统匈牙利符号 - 更好地命名我的变量,以便我知道它们是实际的 Edge 对象还是只是我想要的 Edge 的 id。实现强类型——make remove_edge(这是一个方法Net)明确拒绝任何不是Edge. 制作一个包装函数remove_edge_id,从中查找相关内容Edgeid然后调用remove_edge; 这个函数同样拒绝任何不是id.

  2. 使用鸭子打字。remove_edge检查参数是 anid还是 an并用它做Edge正确的事情。

你猜怎么着?

0 投票
3 回答
915 浏览

python - 如何记录鸭子类型?

我的文档很臃肿,因为每当我遇到复杂的鸭子类型时,我都需要某种方式来表达“这种鸭子类型”,但却陷入了“你的函数需要这个输入,但没有'不记录它”,然后记录它。这会导致臃肿、重复的文档,例如:

等等,等等,for BazQux,和其他函数。我需要一些更短的写作方式“arg是一种(对象的类型)”。

对于某些鸭子类型,它就像“类似字典的对象”一样简单:我们知道我们对字典的期望,因此我们知道要传递什么。A dict,或者可以模仿它的东西。

我觉得 C++ 对模板类型也有同样的问题。Haskell 会拥有它,但可以使用类型类的定义来记录它。(注意:Haskell 类!= Java/C++/Python/etc 中的类。)(注意:我并没有真正使用 Haskell 编程,如果这是一个糟糕的例子,请原谅我。)

我应该走传统的 OO 路线,只写一个基类,然后在文档中说“像这个基类这样的东西”吗?代码不会强制从基类派生(因为不需要从基类派生对象),并且基类基本上没有添加任何值,除了记录接口的属性。

另一方面,我正在编写 Python 编程,并且我尝试使用一种语言的习语进行编程。(否则通常会很痛苦。)基类有利于继承功能,但是当您的基类完全抽象时,它似乎不会在鸭子类型语言中增加价值。


编辑:答案:我知道什么是鸭子打字(这应该从帖子中显而易见)。我在哪里记录它是一个问题,尤其是。当不存在附加文档的类时。

0 投票
3 回答
914 浏览

c# - 现有对象实例上的鸭子类型/动态代理

我有一个对象交给我们的图书馆并通过了各种流程。当这些对象通过各个阶段并从另一端出来时,我需要为它们附加一些额外的信息——我猜这是一种动态装饰器模式,除了添加额外的属性而不是改变现有的行为。

我希望使用 LinFu 或 Castle 来创建动态代理并在对象上实现一个附加接口来存储它。知道扩展接口的组件可以转换和访问它 - 而那些不被遗忘的组件,因为底层类型没有改变。

但是,我没有意识到所有这些机制都假设您可以控制最初创建类型的点 - 我没有。

有人对我如何更好地解决这个问题有建议吗?

非常感谢

0 投票
1 回答
84 浏览

xslt - 使用 XSD 在 XSLT 中对元素进行 Duck 键入

我在 XSL 中创建一个函数,它接受一个 XML 元素作为参数。我对这个 XML 元素有一定的期望:例如,它必须有一个<name>子元素和一个<id>子元素。因此,以下两个元素中的任何一个都是可以接受的:

请注意,我不关心元素名称、<name><id>出现的顺序以及元素具有的任何其他子元素(或属性)。

我可以在 XSD 中表达这个要求,并将其用于as属性<xsl:param>吗?

0 投票
2 回答
285 浏览

python - Python 文档:可多次迭代?

在记录 Python 函数时,我发现它更像 Pythonic:

……而不是……</p>

当真i的不需要是一个list. (Foo会很高兴地在 a set,tuple等上操作)问题是生成器。生成器通常只允许 1 次迭代。大多数函数都可以使用只允许单次传递的生成器或迭代器,但有些则不行。

对于那些不能接受只能迭代一次的生成器/事物的函数,是否有一个清晰、一致的 Python 术语来表示“只能迭代多次的事物”?

可迭代迭代器的 Python 词汇表似乎有一个“一次,但如果幸运的话可能更多”的定义。

0 投票
2 回答
620 浏览

pattern-matching - “迭代”异步方法

关于异步 CTP 的一些相关问题:

  • 我可以使用枚举器方法和枚举器方法迭代迭代器块(IEnumerable<T>返回收益T)。方法的类比是什么?非调用方法如何接收和处理任何ed 项目然后?你能提供一个简短的例子吗?我只是没看到。GetEnumerator()MoveNext()Current()asyncasyncawaitContinueWith()

  • 此外,在以下示例async方法中,MyAwaitable有一个GetAwaiter()方法。如果GetAwaiter()返回 a stringbut THuhis not string,编译器不会抱怨。THuh和之间存在什么类型的约束/期望GetAwaiter()

    /li>
  • 请解释 C# 规范草案的以下行。async Task<T>方法应该永远不会被使用return吗?default(T)我看到一些似乎不遵循此规则的示例 - 返回值似乎可以达到,并且该值是非默认值。这个值是不可访问的吗?如果是这样,为什么尴尬的无法访问的 return 语句?

在返回类型Task<T>为 some的异步函数中T,return 语句必须具有可隐式转换为 的表达式T,并且主体的端点必须不可到达。

  • 规范说“GetAwaiter、IsCompleted、OnCompleted 和 GetResult 的所有内容都是“非阻塞”的”——那么应该以什么方法定义(可能)长时间运行的操作?

谢谢!