Почему подкласс является экземпляром объекта? - PullRequest
0 голосов
/ 05 мая 2019

Как я знаю, подкласс должен быть подклассом object, но почему он также является экземпляром object?

hmank ~ » python
Python 3.7.3 (default, Mar 26 2019, 21:43:19) 
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...   pass
... 
>>> isinstance(A, object)
True
>>> issubclass(A, object)
True
>>> 

Более того, я цитирую @prosti ответ, что isinstance

Возвращает логическое значение, указывающее, является ли объект экземпляром или подклассом другого объекта .

Но примеры по той же ссылке показывают

>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>

Кажется, это означает, что class1 является экземпляром class2 , если и только если class2 равно object, верно?

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Поскольку все в python рассматривается как объект, что является более хорошим способом сказать, что каждый объект является экземпляром объекта в python!

Если вы подумаете об этом, это имеет смысл, так как pythonявляется объектно-ориентированным языком, и поэтому вполне нормально, что каждое значение является объектом


In [9]: class A: 
   ...:     pass 
   ...:                                                                                                                                               

In [10]: isinstance(A, object)                                                                                                                        
Out[10]: True

In [11]: isinstance(A(), object)                                                                                                                      
Out[11]: True

In [12]: isinstance(1, object)                                                                                                                        
Out[12]: True

In [13]: isinstance([2,3], object)                                                                                                                    
Out[13]: True

In [14]: isinstance('hello', object)                                                                                                                  
Out[14]: True
1 голос
/ 05 мая 2019

Неплохой вопрос.

class A:
  pass

a = A()

print(isinstance(a, A)) #True
print(isinstance(object, A)) #False
print(isinstance(A, object)) #True
print(issubclass(A, A)) #True
print(issubclass(A, object)) #True

По определению isinstance:

Возвращает логическое значение, указывающее, является ли объект экземпляром илиподкласс другого объекта.

С другой стороны issubclass:

Возвращает тип Bool, указывающий, является ли объект подклассомкласс.

С дополнительным замечанием, что класс считается подклассом самого себя.


Обновление:

Кажется, это означает, что class1 является экземпляром class2, если и только если class2 является объектом, верно?

Вы получаете ответы путем тестирования, а логика очень проста.Класс - это класс, а объект - это экземпляр класса.

Вы можете проверить код, если вам действительно нужно понять реализацию .

Также вы можетенайдите тестовых случаев , если вы гик.

Объект должен быть создан для того, чтобы классифицировать для True в следующих примерах:

class Foo: pass
class Bar(Foo): pass
print(isinstance(Bar(), Foo)) #True
print(isinstance(Bar(), Bar)) #True

print(Bar) #<class '__main__.Bar'>
print(Bar()) #<__main__.Bar object at 0x7f9fc8f32828>

Такженекоторые примеры здесь специфичны для Python3, если вы парень из Python2, вы должны знать, что вы должны быть более явными и писать:

class Bar(object): pass

Часть (object) обязательна, если вы пишете Python-независимый код,Наконец, проверьте Стандарт на перегрузку isinstance () и issubclass () , но имейте в виду, что стандарты являются "живыми" и могут обновляться в будущем.

Наконец, вы можете проверить this по отношению к объектам классов.

1 голос
/ 05 мая 2019

В python3 все классы являются производными от object, поэтому

class A(object):
    pass

и

class A:
    pass

идентичны.Относительно того, почему isinstance(A, object) возвращает Trueсм. следующий код

class A: 
    @classmethod 
    def do(cls): 
        print(f"hello from {cls.__name__}") 

A.do()                                                                  

# hello from A
...