当前位置: 首页 > 面试题库 >

多态性在Python中如何工作?

庄兴发
2023-03-14
问题内容

我是Python的新手…并且来自Java的背景,如果可以说明这一点的话。

我正在尝试了解Python中的多态性。也许问题在于我期望将我已经知道的概念投影到Python中。但是我整理了以下测试代码:

class animal(object):
    "empty animal class"

class dog(animal):
    "empty dog class"

myDog = dog()
print myDog.__class__ is animal
print myDog.__class__ is dog

从我习惯的多态性(例如java的多态性)来看instanceof,我希望这两个语句都能显示为true,因为dog的实例 既是 动物又
狗。但是我的输出是:

False
True

我想念什么?


问题答案:

isPython中的运算符检查两个参数是否引用内存中的同一对象;它不像isC#中的运算符。

从文档:

运算符是否测试对象标识:并且仅当x和y是同一对象时,x is y才是true。x不是y会产生反真值。

在这种情况下,您要寻找的是isinstance

如果object参数是classinfo参数或其(直接或间接)子类的实例,则返回true。

>>> class animal(object): pass

>>> class dog(animal): pass

>>> myDog = dog()
>>> isinstance(myDog, dog)
True
>>> isinstance(myDog, animal)
True

但是,惯用的Python指示您(几乎)从不进行类型检查,而是依靠鸭子类型进行多态行为。使用isinstance理解继承没有错,但是通常应该在“生产”代码中避免使用继承。



 类似资料:
  • 问题内容: 如何在Python中声明静态属性? 这里写了我如何声明一个方法: Python中的静态方法? 问题答案: 在Python的类级别定义的所有变量均被视为静态 在类中,您可以使用相同的名称拥有两个不同的变量(一个静态变量和一个普通变量)。不要困惑。

  • 问题内容: 我已经成功地使用了Python属性,但看不到它们如何工作。如果我取消引用类之外的属性,我只会得到一个类型的对象: 但是,如果我将一个属性放在一个类中,则行为会大不相同: 我注意到未绑定仍然是对象,因此类实例化必须在做魔术,但是那是什么魔术呢? 问题答案: 正如其他人指出的那样,它们使用称为描述符的语言功能。 当您通过类访问实际属性对象时,返回该属性对象的原因在于该属性如何实现特殊方法:

  • 问题内容: 假设我创建了一个类的实例,并想为其公共属性分配一些值。通常,这将是这样完成的: 但是,如果编写一个将类作为参数的函数,而我想动态地为该类的公共属性分配一些值,那就是通过变量和循环(不知道有多少个或被称为什么)。 ) 显而易见的是: 但这是行不通的。 有任何想法吗? 问题答案:

  • 问题内容: 我想知道rstrip和lstrip如何在python中工作。说,如果我有一个字符串 剥离单词如何工作? 理想情况下,输出应该是“ thist”(对于第一种情况)和“ that”(对于第二种情况)对吗? 还是像正则表达式一样,匹配每个字符,以及最后看到的哪一个字符都会删除(对于第三种情况)? 注意:我不是在寻找替换,我只是想知道从字符串中删除子字符串时,strip的工作方式。 问题答案:

  • 当我将inplace属性的值更改为False时,索引"a"中的元素未删除,但当我更改inplace=True value at index"a"时删除。我不明白它是如何工作的。

  • 问题内容: 我想找出Python中某个方法的优点(它接收的参数数量)。现在我正在这样做: 我希望能够实现这一目标: 更新 :现在上面的函数无法使用内置类型,对此的任何帮助也将不胜感激: 问题答案: Python标准库中的模块是您的朋友- 请参阅在线文档! 返回四个选项的元组,:是“主元数”,但参数数量可以从任何东西到无穷大,如果你有和/或没有,而一些参数可以省略(默认和)如果不是。你怎么把它变成一