码迷,mamicode.com
首页 > 其他好文 > 详细

再看属性查找

时间:2020-04-15 18:40:10      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:font   定义   each   ict   实例   基于   查找   acl   type   

再看属性查找

结合python继承的实现原理+元类重新看属性的查找应该是什么样子呢???

属性查找的原则:对象-》类-》父类

切记:父类 不是 元类

 

在学习完元类后,其实我们用class自定义的类也全都是对象(包括object类本身也是元类type的 一个实例,可以用type(object)查看),

我们学习过继承的实现原理,如果把类当成对象去看,将下述继承应该说成是:对象StanfordTeacher继承对象Foo,对象Foo继承对象Bar,对象Bar继承对象object

class Mymeta(type):
n=444

def __call__(self, *args, **kwargs): #self=<class ‘__main__.StanfordTeacher‘>
obj=self.__new__(self) # StanfordTeacher.__new__
# obj=object.__new__(self)
print(self.__new__ is object.__new__) #True
self.__init__(obj,*args,**kwargs)
return obj

class Bar(object):
# n=333

# def __new__(cls, *args, **kwargs):
# print(‘Bar.__new__‘)
pass

class Foo(Bar):
# n=222

# def __new__(cls, *args, **kwargs):
# print(‘Foo.__new__‘)
pass

class StanfordTeacher(Foo,metaclass=Mymeta):
# n=111

def __init__(self,name,age):
self.name=name
self.age=age
#
#
# obj=StanfordTeacher(‘lili‘,18)
# print(obj.__dict__)
# print(obj.n)
print(StanfordTeacher.n)
于是属性查找应该分成两层,一层是对象层(基于c3算法的MRO)的查找,另外一个层则是类层(即元类层)的查找

对象发起的属性查找:找到object 停止查找
类发起的属性查找:object没找到会继续寻找元类

再看属性查找

标签:font   定义   each   ict   实例   基于   查找   acl   type   

原文地址:https://www.cnblogs.com/h1227/p/12706628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!