как я могу заставить isinstance () работать как положено? - PullRequest
0 голосов
/ 05 июля 2019

В процессе изучения Python я наткнулся на функцию isinstance, но она не работает так, как я ожидал. несмотря на то, что экземпляр и его класс являются параметрами, он все равно возвращает false.

Я просмотрел этот и некоторые другие веб-сайты, но мне не удалось найти что-либо относительно моей конкретной ситуации. Я протестировал его с Python 3.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). Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 05 июля 2019

Вот правильный код:

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 , используя, среди прочего, верблюжий регистр для имен классов.
  2. Метод должен объявлять self в качестве первого параметра, если только он не является статическим методом (но в этом случае он должен быть объявлен как таковой).
  3. isinstance должен принимать объект в качестве первого параметра, а класс (или кортеж или классы) в качестве второго. Ваш второй isinstance звонок вернет TypeError
  4. При создании экземпляра объекта необходимо добавить скобки после имени класса: my_owl = Owl(). Если вы этого не сделаете, my_owl будет ссылаться не на объект Owl, а на определение класса Owl.
3 голосов
/ 05 июля 2019

my_owl=owl делает my_owl псевдонимом класса owl, а не экземпляром owl.Вам нужно добавить круглые скобки:

my_owl = owl()

, чтобы создать экземпляр, после чего будет работать isinstance(my_owl, owl).

После того, как вы это сделаете, у вас возникнут другие проблемы.Вам нужно будет добавить явный параметр self к вашим методам fly и hoot (которые иначе не являются допустимыми методами экземпляра) или, альтернативно, украсить их с помощью декоратора @staticmethod (поэтому они не нуждаются в self, но могут вызываться как для класса, так и для экземпляров класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...