在学习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)。 预先感谢。
答案 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
解释:
self
声明为第一个参数,除非它是static method(但在这种情况下,应这样声明)。isinstance
应将一个对象作为第一个参数,并将一个类(或元组或多个类)作为第二个参数。您的第二次isinstance
通话将返回TypeError
my_owl = Owl()
之后添加括号。否则,my_owl
不会引用Owl对象,而是引用Owl的类定义。答案 1 :(得分:3)
my_owl=owl
使my_owl
是owl
类的别名,而不是owl
的实例。您需要添加括号:
my_owl = owl()
创建一个实例,之后isinstance(my_owl, owl)
将起作用。
完成后,您还会遇到其他问题。您需要向self
和fly
方法(否则不是有效的实例方法)中添加显式的hoot
参数,或者用the @staticmethod
decorator装饰它们(因此它们不需要self
,但可以在类和类的实例上调用。