据我所知,子类应该是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
Returns a Boolean stating whether the object is an instance or subclass of another object。
但是在同一链接上的示例显示了
>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>
看来,这意味着 class1 是 class2 的实例,当且仅当 class2 是object
,对吗?< / p>
答案 0 :(得分:1)
在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
答案 1 :(得分:1)
因为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
答案 2 :(得分:1)
一个不错的问题。
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是对象时,对吧?
您可以通过测试获得答案,逻辑非常简单。一个类是一个类,对象是一个类的实例。
如果您确实需要了解implementation,可以检查代码。
如果您是极客,也可以找到test cases。
在以下示例中,必须实例化该对象以便为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
如果您编写Python无关代码,则(object)
部分是必须的。
最后检查Standard on Overloading isinstance() and issubclass(),但要记住标准是“实时的”,将来可能会更新。
最后,您可以在类对象关系上检查this。