如何使isinstance()按预期工作?

2024-10-02 00:39:56 发布

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

在学习python的过程中,我遇到了isinstance函数,但它的行为与我预期的不同。尽管将实例及其类作为参数,它仍然返回false

我浏览了这个网站和其他一些网站,但我没有找到任何关于我的确切情况。我已经用python3.7.3测试过了

我就是这么用的:

class bird:
    def fly():
        print("all birds fly.")
class owl(bird):
    def hoot():
        print("owls hoot.")
my_owl=owl
my_owl.fly()
my_owl.hoot()
print(isinstance(my_owl, owl))
print(isinstance(owl, my_owl))

我颠倒了实例和类参数的顺序,只是为了确保首先覆盖了所有的基。根据我阅读的教程,isinstance应该在上面两种情况之一返回True(特别是第一种情况,但在两种情况下都返回false)。 提前谢谢


Tags: 实例false参数网站过程mydef情况
2条回答

以下是正确的代码:

class Bird():
    def fly(self):
        print("all birds fly.")

class Owl(Bird):
    def hoot(self):
        print("owls hoot.")

my_owl = Owl()
my_owl.fly()
my_owl.hoot()
print(isinstance(my_owl, Owl)) # >> True

解释如下:

  1. 试着尊重python naming conventions,在类名中使用camel大小写
  2. 方法应该声明self为第一个参数,除非它是static method(但在本例中,应该声明为第一个参数)
  3. isinstance应将对象作为第一个参数,将类(或元组或类)作为第二个参数。您的第二个isinstance调用将返回TypeError
  4. 实例化对象时,应在类名后添加括号:my_owl = Owl()。如果不这样做,my_owl将不会引用Owl对象,而是引用Owl的类定义

my_owl=owl使my_owl成为owl类的别名,而不是owl的实例。您需要添加括号:

my_owl = owl()

创建一个实例,之后isinstance(my_owl, owl)将工作

一旦你这么做了,你会有其他的问题。您需要将显式的self参数添加到flyhoot方法(否则它们不是有效的实例方法),或者,用the ^{} decorator装饰它们(因此它们不需要self,但是可以在类和类的实例上调用)

相关问题 更多 >

    热门问题