使用Python“isinstance”对吗?

2024-10-01 11:40:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个不同块的二维数组,都是从块继承的。我想检查我单击的块是否是污垢类型的块,如下所示:

clickedblock = getClickedBlock()

if isinstance(clickedblock, Dirt):
    place a block

else:
    don't place a block

我听说isinstance不好,应该避免,因为它会在代码中创建分叉。使用isinstance什么时候比较好?在

对于我的问题,另一个更麻烦的解决方案是使用一个名为'id'的块字段,然后检查它是否等于某个常量,这意味着灰尘。但这听起来很糟糕,而且比简单的isinstance更容易出错。在


Tags: 代码id类型ifplace数组解决方案block
3条回答

如果你不想用它,你还有其他选择。传统的鸭子打字解决方案:

try:
    clickedblock_place = clickedblock.place
except AttributeError:
    # don't place block
else:
    clickedblock_place()

也可以使用hasattr:

^{pr2}$

我几乎从不使用isinstance,除了检查(还是关闭?)例如,如果需要知道名称是指向str还是unicode:

if isinstance(str1, basestring):
    blah, blah, blah

祝你好运, 迈克

您的示例似乎是isinstance()的合法用例。在

并不是说isinstance()不好,多态性通常可以用于相同的目的(这会导致使用类的代码更干净)。在

但有时,isinstance()正是你所需要的。例如,检测变量是否为字符串的python方法是isinstance(var, basestring)。在

我学会了不使用它的艰难方法。问题是结果对类定义的导入方式很敏感:

  • 在对象被实例化的地方
  • 在执行isinstance测试的地方

如果一个导入是相对的,另一个是绝对的-检查将失败。 本质上,这就像检查SomeClasssomepackage.SomeClass之间的相等性。从档案上看也不一样。另外,如果您的根目录和somepackage目录都在PYTHONPATH中,也会出现类似的结果,那么绝对样式的导入可以表示来自其中一个“源根”的路径,因此两个不同的绝对样式导入将导致实例检查失败。在

有人可能会争论,好的做法无论如何都会阻止这种情况的发生,但良好的做法在很大程度上也是关于不冒险的。本着这种精神,我更喜欢在一个公共祖先类中放一些抽象方法,这样我以后就可以依赖于事情是如何嘎嘎作响的,而不是依赖于解释器认为它们是什么。在

在Java中,每个类解析为其完全限定的类名。这些在程序中是独一无二的,对实例的测试是轻而易举的。在Python中,这些可能很滑。在

相关问题 更多 >