- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我们有以下类:
class Duck(object):
pass
class OldFashionedDuck(Organism, Duck):
def look(self):
self.display_biological_appearance()
def walk(self):
self.keep_balance_on_two_feet()
def quack(self):
self.make_noise_with_lungs("Quack!")
class ArtificialDuck(Robot, Duck):
def look(self):
self.display_imitation_biological_appearance()
def walk(self):
self.engage_leg_clockwork()
def quack(self):
self.play_sound("quack.au")
在这个例子中,OldFashionedDuck 和 ArtificialDuck 没有共同的实现,但通过构造它们都会为 isinstance(..., Duck) 返回 True。
这并不完美,但我认为它可能有助于尊重鸭子类型(duck typing),并且(通过空混合继承)允许 isinstance()。从本质上讲,它提供了满足接口(interface)的契约,因此它并不是真正基于完成所有工作的类调用 isinstance(),而是基于任何人都可以选择加入的接口(interface)。
我看过基于“isinstance() 被认为是有害的”的文章,因为它破坏了 duck 类型。但是,至少作为一名程序员,我想知道,如果对象不一定从哪里获得函数,而是它是否实现了接口(interface)。
这种方法是否有用,如果有用,是否可以对其进行改进?
最佳答案
I've seen articles based on "isinstance() considered harmful," because it breaks duck typing. However, I at least as a programmer would like to know, if not necessarily where an object gets a function from, but whether it implements an interface.
我认为你没有捕获重点。
当我们谈论“鸭子类型(duck typing)”时,我们真正的意思是没有形式化我们的接口(interface)。因此,您尝试做的事情归结为尝试回答“我如何在仍未形式化我的界面的情况下形式化我的界面?”这个问题。
我们期望给我们一个对象来实现一个接口(interface)——我们描述的一个接口(interface),不是通过创建一个基类,而是通过编写一堆文档和描述行为(如果我们感觉特别活泼,设置建立某种测试套件)——因为我们说过这是我们所期望的(同样在我们的文档中)。我们通过尝试像使用它一样使用它来验证对象是否实现了接口(interface),并将任何由此产生的错误视为调用者的责任。调用给我们错误对象的代码是顽皮的,这就是需要修复错误的地方。 (同样,测试可以帮助我们追踪这些事情。)
简而言之,测试 isinstance(this_fuzzball_that_was_handed_to_me, Duck)
并没有真正的帮助:
它可以通过 isinstance
检查,但以违反我们预期的方式实现方法(或者说,return NotImplemented
)。只有真正的测试才会在这里进行。
可以通过检查,但实际上完全没有实现其中的一个或多个方法;毕竟,基础 Duck
不包含任何实现,Python 没有理由在派生类中检查它们。
也许更重要的是,它可能无法通过检查,即使它是一个完全可以用作鸭子类型(duck typing)的毛绒球。也许它是一些不相关的对象,它们具有 quack
、walk
和 look
函数,直接作为属性手动附加到它(而不是它们是它的类,在查找时成为方法)。
好吧,所以,“不要那样做”,你说。但是现在你正在为每个人做更多的工作;如果客户端不总是选择加入,那么使用鸭子类型(duck typing)的代码进行检查是无用且危险的。同时,您获得了什么?
这与 EAFP 原则有关:不要试图通过观察来判断某物是否是 Duck;通过将它视为鸭子类型(duck typing)来判断它是否是鸭子类型(duck typing),如果不是,则处理血淋淋的困惑。
但是,如果您不关心鸭子类型(duck typing)哲学,并且绝对必须强加一些表面上的严谨性,您可能会对标准库 abc
模块感兴趣。
关于python - 这种将 Python 鸭子类型(duck typing)与 isinstance() 混合使用的方法是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435122/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我习惯于动态类型意味着在运行时检查对象/非面向对象结构的类型信息并抛出某种类型错误,即如果它像鸭子类型(duck typing)一样嘎嘎叫,它就是一只鸭子类型(duck typing)。是否有不同类型
这是《Practical Object-Oriented Design in Ruby》书中的一个示例。我有兴趣将这个 ruby 代码翻译成 javascript,以便更好地理解 JS 中的鸭子类
我又在 Scala 闲逛,我希望这是一个关于鸭子类型的基本问题,或者它可能真的与函数定义有关。让我解释: 鉴于以下代码: package johnmcase.scala.oneoffs object
Typescript 在某些情况下执行“鸭子”键入,例如当您针对接口(interface)检查函数参数的有效性时。 例如: interface Named { name: string } fun
代替遍历集合,有时在过程上循环遍历它们更方便。为了避免根据输入区分$_和$_.Key / $_.Value,更一致的键/值处理将是不错的: ForEach-KV $object { Param($k,
我正在使用带有继承的面向对象方法来解决问题,并且我想知道如何将“鸭子类型(duck typing)”原则应用于此问题。 我有一个类 BoxOfShapes ,它将使用 Shapes 列表(Circle
我正在尝试找到一种方法来为继承一对相似接口(interface)的两个对象表达共同的基类型。 请看下面的代码:很明显,fb1 和 fb2 应该有一个可能的公共(public)基类型(例如,类似 IFi
我有一个使用参数元组创建类实例的“工厂”: def factory(cls, arg): return cls(*arg) class Foo(object): def __init__(se
我正在编写一个 Duck 类,这样创建的每个 Duck 对象都包含翼展和重量字段变量。每只鸭子都应该随机初始化这些中的每一个。翼展应初始化为 [80.0,100.0]cm 范围内的随机 float 。
我有一些代码可以在我的应用程序中实现音频闪避。当用户正在听一些音乐时,然后进入某个位置,将播放特定的音乐片段。发生这种情况时,正在播放的原始音乐“低声”(或变得更安静),而我的应用程序开始播放的新音乐
如 TypeScript 中所述 handbook : One of TypeScript’s core principles is that type-checking focuses on the
Python 有特定的 ABCs for container types .它说它们是,“……用于测试类是否提供特定接口(interface)。” (而且它们对某些混入也很有用,但我们暂时忽略它。)
问题 我现在已经阅读了很多关于 Duck Typing 的内容,并且我似乎理解了这个概念。 我不明白的是,在什么情况下放弃强类型化编程的好处而转向 Duck Typing 的好处实际上是有意义的。 在
我的文档太多了,因为每当我遇到一个复杂的鸭子类型(duck typing)时,我都需要某种方式来表达“这个鸭子类型(duck typing)”,但却陷入了“你的函数需要这个输入的这个”的无休止循环,但
在 Advantages of Exceptions Java™ 教程的部分: A method can duck any exceptions thrown within it, thereby a
在我目前的工作中,我正在构建一套严重依赖对象的 Perl 脚本。 (在哈希上使用 Perl 的 bless() 以尽可能接近 OO) 现在,由于缺乏更好的表达方式,我公司的大多数程序员都不是很聪明。更
Can I specify interfaces when I declare a member? 在考虑了这个问题一段时间后,我突然想到静态鸭子类型(duck typing)的语言可能真的有效。为什
我对这两个术语有点困惑,这就是我所知道的: 多态性是不同类型的对象由一个公共(public)接口(interface)处理的能力。而鸭子类型(duck typing),是一种动态类型,它允许不同类型的
所有动态语言都支持duck typing ? 我认为 PHP 支持鸭子类型(duck typing)。是这样吗? 最佳答案 任何动态类型的 oop 语言都支持鸭子类型(duck typing),包括
我是一名优秀的程序员,十分优秀!