作者ThxThx (洗洗睡)
看板Python
标题Re: [问题]obj.__class__() 记忆体位址
时间Wed Jul 25 06:46:19 2018
※ 引述《LouisFFs ()》之铭言:
: ---------------------------------
: class Something:
: pass
: print('define a class:')
: print(Something) #(1)
: print(type(Something))
: print('create an object:')
: s=Something()
: print(s) #(2)
: print(type(s))
: print('__class__ read data:')
: print(s.__class__) #(3)
: print(s.__class__()) #(4)
: -----------------------------------
: output:
: define a class:
: <class 'Something'>
: <class 'type'>
: create an object:
: <Something object at 0x0238DD70>
: <class 'Something'>
: __class__ read data:
: <class 'Something'>
: <Something object at 0x0239F730>
: ------------------------------------
几个物件的关系是这样,箭头代表实例化:
type --> Something --> s
1. Something是type的一个instance,s是Something的instance。
type是一切的根源:type是type的instance。
2. type其实是一个metaclass。一个metaclass实例化後是一个class。
其实我们也可以直接呼叫type来产生一个class。
而因为所有东西都是物件,Something和s如果这样看的话没有什麽不同
(所以我想你说的"等价一个命名空间"这个概念应该是不正确的)。
3. 用obj.__class__可以得到obj的class,s.__class__()其实等同於Something(),
更进一步也等同於Something.__call__()。
因此,#(2)和#(4)是两个不同的Something instance,所以记忆体不同。
4. 但是,不要用obj.__class__来检查obj是哪一个class。
请用isinstance(s, Something),它可以帮你检查继承。
```
>>> Something = type('Something', (), {})
>>> s = Something()
>>> type.__class__ == type
True
>>> Something.__class__ == type
True
>>> isinstance(Something, type)
True
>>> s.__class__ == Something
True
>>> isinstance(s, Something)
True
```
※ 编辑: ThxThx (114.44.199.194), 07/25/2018 06:48:05
1F:推 LouisFFs: 谢谢你! 理解了!! 07/25 09:32