python魔法函数与协议,元类,类和实例之间的关系

python 专栏收录该内容
32 篇文章 0 订阅

一、魔法函数与协议

在python中可以把魔法函数看作是python内置的一些接口和协议。不同的类型由不同的协议构成,当我们实现了某种协议,实际上就可以认为满足这种类型。
在python中有一个模块collections的abc抽象类中,给我们提供了实现这些类型需要继承的方法。(可以把他看做python给我们提供的文档)
魔法函数是对于类型拥有的行为的约束。(行为约束)
python更加注重的是对象拥有的行为,而不是它属于哪个类型。(isinstance方法的实质)
最特殊的两个魔法函数:

_ new__和__init_

二、元类,类和实例之间的关系

在这里插入图片描述

元类:能够创建类的类,我们称作元类,type就是最原始的一个元类。
如果要自定义元类,必须要显示继承于type类。class Model(object,metaclass=type):pass
类:也叫类对象,python中一切皆是对象,类对象 是由 type 类实例化产生 ,(type也是一个类,它还实例化自己,这就做到了一些皆对象)也就是 type 类中的__new__方法。
实例对象:而实例对象是由该类的__new__方法进行创建对象。
type有两个用处:
1.type当做函数用,同__class__属性作用相同,返回对象的类型
2.type当做类用,是元类,用于创建其它的类。
class meta(type):
    def __new__(cls, *args, **kwargs):
        print("i am meta")
        return super().__new__(cls,*args,**kwargs)

class obj(object):
    def __new__(cls, *args, **kwargs):
        print("i am obj")
        return super().__new__(cls)


class BaseModel(obj,metaclass=meta):  

    def __init__(self):

        pass


user =BaseModel()

结果:

i am meta
i am obj
执行顺序:
1、当执行到BaseModel时,会找到他的元类metaclass=meta,然后先创建BaseModel这个类对象,然后必须返回该类对象。
2、然后,执行到user =BaseModel()这句,通过找到__new__方法,也就是继承的类中的__new__方法。它会为对象分配内存地址,并返回对象的引用,调用类中的__new__函数(该函数是静态函数,调用时需要主动传递cls)创建该类的实例对象,必须返回该实例对象。一般是object基类中的提供的__new__方法。
3、该实例接着调用它的__init__函数初始化实例变量。
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值