python类型对象<class ‘type‘>的理解与探究

'''
1、python解释器创建类时会同步生成与类名"myclass"同名的一个类型对象,类型对象myclass
是内置builtins模块的type类的一个实例,表示一个类型。这个类型对象除了继承有type类
的实例属性(比如type类又从基类object继承的__class__实例属性)外,还"吸收"了用户
定义类时定义的类属性,当用户定义的类属性与type类的实例属性重名时,type类的实例属
性将屏蔽用户定义的类属性,比如下例用户覆盖定义了"__class__"类属性,但不管在类方法
内访问__class__(即cls.__class__),还是在全局作用域访问(即myclass.__class__)都
访问的是type类属性,而不是用户定义的类属性。只有在类型对象myclass的__dict__字典中
才能访问到用户定义的同名类属性
    总结:类型对象的实例属性由两部分组成:1、type类的实例属性,如值恒为<class 'type'>
的__class__属性;2、用户定义类时提供的类属性;

2、python这个动态语言中变量的类型取决于变量的类型属性__class__,__class__值决定
了这个变量的类型,而类型决定了这个变量可以执行的操作,典型用于修改派生类实例对象的
实例属性__class__为基类的类型对象,从而能访问基类的实例方法。
    当然,变量执行操作时会对方法进行名字查找,找不到的话就会提示属性错误
"AttributeError",因此变量的类型属性__class__不能乱改。
'''
class myclass():
    '''自定义类'''
    attrcls1='heihei'
    __class__='haha' #i、类型对象myclass的类type有从object基类继承名字"__class__"
                     #的实例属性,这里为类myclass新增一个同名的类属性
    @classmethod
    def ClsMethod(cls):
        print('cls.__class__: ', cls.__class__)

myclass.ClsMethod() #ii、打印<class 'type'>,并没有打印出"haha",说明type类的实例
                    #属性__class__屏蔽了myclass类的类属性__class__
print('myclass.__class__: ', myclass.__class__) #iii、打印<class 'type'>
print(myclass.attrcls1) #正常打印"heihei"
print('myclass.__dict__["__class__"]', myclass.__dict__["__class__"]) 
              #iV、打印"haha",通过类型对象的属性字典还是可以访问到重名的类属性的
#obj=myclass()
#print('obj: ', obj) #<__main__.myclass object at 0x7efd6fdc32e0>
#print('myclass: ', myclass) #<class '__main__.myclass'>

python3.8执行输出:

haypin@ubt:~/Files$ python3.8 m08012.py
cls.__class__:  <class 'type'>
myclass.__class__:  <class 'type'>
heihei
myclass.__dict__["__class__"] haha
haypin@ubt:~/Files$ 

猜你喜欢

转载自blog.csdn.net/HayPinF/article/details/107733029