python内置属性类_Python内置类属性,元类研究
Python內(nèi)置類屬性
我覺(jué)得一切都是對(duì)象,對(duì)象和元類對(duì)象,類對(duì)象其實(shí)都是一樣的,我在最后進(jìn)行了證明,但是只能證明一半,最后由于元類的父類是type,他可以阻擋對(duì)object屬性的訪問(wèn),告終
__dict__ : 類的屬性(包含一個(gè)字典,由類的數(shù)據(jù)屬性組成)
__doc__ :類的文檔字符串
__name__: 類名
__module__: 類定義所在的模塊(類的全名是'main.className',如果類位于一個(gè)導(dǎo)入模塊mymod中,那么className.module 等于 mymod)
__base__:類的第一個(gè)父類
__bases__ : 類的所有父類構(gòu)成元素(包含了一個(gè)由所有父類組成的元組)
__class__:創(chuàng)建本對(duì)象的類
__dict__
對(duì)象加.能出來(lái)的就是存在它里面的。
實(shí)驗(yàn)室
例1
從打印結(jié)果發(fā)現(xiàn),z對(duì)象的__dict__()是空的,為啥他能打印出東西呢?它遵循下面的屬性查找關(guān)系(需要對(duì)元類有了解)
class zx():
pass
z=zx()
print(z.__dict__)
print(z.__module__)
{}
__main__
例2
代碼中有兩個(gè)屬性被我注釋了,為啥呢?因?yàn)樗业絫ype都沒(méi)有找到,會(huì)報(bào)錯(cuò)(可以把,zx,object,type的__dict__都打印出來(lái),然后在控制臺(tái)搜索)
class zx():
pass
print(zx)
print(zx.__dict__)
print(zx.__class__)
print(zx.__bases__)
print(object.__dict__)
print(type.__dict__)
print(zx.__name__)
print(zx.__doc__)
# print(zx.__slots__)
print(zx.__qualname__)
print(zx.__module__)
# print(zx.__annotations__)
print(zx.__mro__)
于是屬性查找應(yīng)該分成兩層,一層是對(duì)象層(基于c3算法的MRO)的查找,另外一個(gè)層則是類層(即元類層)的查找
class Mytype(type):
name = "zxtype"
def __new__(cls, *args, **kwargs):
return type.__new__(cls, *args, **kwargs)
class hi():
# name = "hi"
pass
class ji(hi,metaclass=Mytype):
# name = 'ji'
pass
# zx = ji()
#
# print(zx.name)
print(ji.name)
#查找順序:自己的總結(jié)
先找自己的,再?gòu)淖约旱睦^承關(guān)系找,在找元類的繼承關(guān)系
總結(jié)
1.調(diào)用自己__dict__里面的方法的話直接對(duì)象調(diào)用就行了,而且不會(huì)默認(rèn)傳一個(gè)對(duì)象參數(shù),如果沒(méi)有用就要用到查找關(guān)系了
2.對(duì)象 先從自己的dict找
再?gòu)淖约旱睦^承關(guān)系找
先從元類中找
最后從元類繼承關(guān)系找
元類的屬性優(yōu)先于元類的繼承關(guān)系
class cc():
name="das"
class zx(cc):
name="20"
z=zx()
print(z.name)
20
class Mytype(type):
name=20
class zx(metaclass=Mytype):#zx=Mytype()
pass
print(zx.__doc__)
None #type的__doc__不為None
繼承關(guān)系__bases__只有object有
自己的繼承關(guān)系優(yōu)先于元類的屬性
class cc():
name=20
class Mytype(type):
name=10
class zx(cc,metaclass=Mytype):
pass
#相當(dāng)于zx=Mytype(...)
print(zx.name)
20
對(duì)象這塊無(wú)法證明,對(duì)象沒(méi)有__bases__方法,object也沒(méi)有,但是type有
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python内置属性类_Python内置类属性,元类研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: openlayers地图旋转_地图切换动
- 下一篇: ddos攻击有啥用(ddos攻击有什么用