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

时间:2019-07-05 12:49:07

标签: python python-3.x oop

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

我已经浏览了该网站和其他一些网站,但是我找不到任何关于我的实际情况的信息。我已经用python 3.7.3进行了测试。

这是我的用法:

library(tidyverse)

input %>%
  mutate(row = row_number()) %>%
  gather(col, value, -row) %>%
  filter(value != "###") %>%
  group_by(row) %>%
  mutate(last_value = row_number()) %>%
  slice(c(n(), n() - 1)) %>%
  mutate(col = c("col1", "col2"), 
        last_value = max(last_value)) %>%
  spread(col, value) %>%
  ungroup() %>%
  select(-row)

# A tibble: 9 x 3
#  last_value col1        col2           
#       <int> <chr>       <chr>          
#1          6 CHARLES AVE BONDI          
#2          6 FRANCIS ST  NEWTOWN        
#3          5 GEORGE ST   SYDNEY         
#4          5 PITT ST     SYDNEY         
#5          6 TONY LANE   CAMPBELLTOWN   
#6          5 MAIN ST     NEWCASTLE      
#7          6 TOM ST      POKOLBIN       
#8          5 STRANGE PDE NEWCASTLE      
#9          4 WOLLONGONG  NEW SOUTH WALES

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

2 个答案:

答案 0 :(得分:4)

这是正确的代码:

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
  2. 方法应将self声明为第一个参数,除非它是static method(但在这种情况下,应这样声明)。
  3. isinstance应将一个对象作为第一个参数,并将一个类(或元组或多个类)作为第二个参数。您的第二次isinstance通话将返回TypeError
  4. 实例化对象时,应在类名my_owl = Owl()之后添加括号。否则,my_owl不会引用Owl对象,而是引用Owl的类定义。

答案 1 :(得分:3)

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

my_owl = owl()

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

完成后,您还会遇到其他问题。您需要向selffly方法(否则不是有效的实例方法)中添加显式的hoot参数,或者用the @staticmethod decorator装饰它们(因此它们不需要self,但可以在类和类的实例上调用。