为什么子类是对象的实例?
Why a subclass is instance of object?
据我所知,子类应该是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.
但同一个 link 上的示例显示
>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>
似乎意味着 class1 是 class2 的实例,当且仅当 class2是object
,对吧?
在 python3 中所有 类 派生自 object
因此
class A(object):
pass
和
class A:
pass
相同。
关于为什么 isinstance(A, object)
returns True
看下面的代码
class A:
@classmethod
def do(cls):
print(f"hello from {cls.__name__}")
A.do()
# hello from A
因为 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
这个问题不错。
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
:
Returns a Boolean stating whether the object is an instance or subclass of another object.
另一方面issubclass
:
Returns a Bool type indicating whether an object is a subclass of a class.
补充说明 class 被认为是其自身的 subclass。
更新:
Seems it means a class1 is an instance of class2, if and only if class2 is object, right?
通过测试得到答案,逻辑超级简单。 class 是 class 对象是 class.
的实例
如果您真的需要理解 implementation,您可以查看代码。
如果你是极客,你也可以找到 test cases。
必须实例化对象才能 class在以下示例中为 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() 但要记住标准是 "live" 并且将来可能会更新。
最后,您可以在 classes 对象关系上检查 this。
据我所知,子类应该是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.
但同一个 link 上的示例显示
>>> class Foo: pass
...
>>> class Bar(Foo): pass
...
>>> isinstance(Bar, Foo)
False
>
似乎意味着 class1 是 class2 的实例,当且仅当 class2是object
,对吧?
在 python3 中所有 类 派生自 object
因此
class A(object):
pass
和
class A:
pass
相同。
关于为什么 isinstance(A, object)
returns True
看下面的代码
class A:
@classmethod
def do(cls):
print(f"hello from {cls.__name__}")
A.do()
# hello from A
因为 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
这个问题不错。
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
:
Returns a Boolean stating whether the object is an instance or subclass of another object.
另一方面issubclass
:
Returns a Bool type indicating whether an object is a subclass of a class.
补充说明 class 被认为是其自身的 subclass。
更新:
Seems it means a class1 is an instance of class2, if and only if class2 is object, right?
通过测试得到答案,逻辑超级简单。 class 是 class 对象是 class.
的实例如果您真的需要理解 implementation,您可以查看代码。
如果你是极客,你也可以找到 test cases。
必须实例化对象才能 class在以下示例中为 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() 但要记住标准是 "live" 并且将来可能会更新。
最后,您可以在 classes 对象关系上检查 this。