zoukankan      html  css  js  c++  java
  • 再看属性查找

    再看属性查找

    结合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没找到会继续寻找元类
  • 相关阅读:
    Python学习1——语法
    Java正则表达式:Pattern类和Matcher类
    BufferedReader 是缓冲字符输入流
    asm 01 开发环境
    vim一个不使用插件的基本配置
    sublime
    一些东西
    jshint 一些选项(转载)
    prototype 和__proto__
    vim 基本使用
  • 原文地址:https://www.cnblogs.com/h1227/p/12706628.html
Copyright © 2011-2022 走看看