Python内置类属性
我觉得一切都是对象,对象和元类对象,类对象其实都是一样的,我在最后进行了证明,但是只能证明一半,最后由于元类的父类是type,他可以阻挡对object属性的访问,告终
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
__base__:类的第一个父类
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
__class__:创建本对象的类
__dict__
对象加.
能出来的就是存在它里面的。
实验室
例1
从打印结果发现,z对象的__dict__()
是空的,为啥他能打印出东西呢?它遵循下面的属性查找关系(需要对元类有了解)
class zx():
pass
z=zx()
print(z.__dict__)
print(z.__module__)
{}
__main__
例2
代码中有两个属性被我注释了,为啥呢?因为它找到type
都没有找到,会报错(可以把,zx,object,type
的__dict__
都打印出来,然后在控制台搜索)
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__)
于是属性查找应该分成两层,一层是对象层(基于c3算法的MRO)的查找,另外一个层则是类层(即元类层)的查找
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)
#查找顺序:自己的总结
先找自己的,再从自己的继承关系找,在找元类的继承关系
总结
1.调用自己__dict__
里面的方法的话直接对象调用就行了,而且不会默认传一个对象参数,如果没有用就要用到查找关系了
2.对象
先从自己的dict找
再从自己的继承关系找
先从元类中找
最后从元类继承关系找
元类的属性优先于元类的继承关系
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
继承关系__bases__
只有object有
自己的继承关系优先于元类的属性
class cc():
name=20
class Mytype(type):
name=10
class zx(cc,metaclass=Mytype):
pass
#相当于zx=Mytype(...)
print(zx.name)
20
对象这块无法证明,对象没有__bases__
方法,object也没有,但是type有