python类之元类

元类

一、概述

python最重要的哲学概念是一切皆对象。我们知道产生实例对象的是类对象,那类对象又是由谁来产生的呢?类对象就是由元类对象产生的,python3中元类方法就是type
type类需要传入三个参数:类名,继承的类的元祖列表,类的方法字典

1、常用产生类的方法

class Foo:
	def __init__(self,name):
		self.name = name

f1 = Foo('hyj')
print("类:%s,实例:%s,实例字典:%s"%(Foo,f1,f1.__dict__))
###:<class '__main__.Foo'>,实例:<__main__.Foo object at 0x1038ad0f0>,实例字典:{'name': 'hyj'}

2、使用type方法来产生一个类

def __init__(self,name):
    self.name = name

Foo = type('Foo',(),{'__init__':__init__}) 
#类名为Foo,继承元祖为空,将__init__写入字典
f1 = Foo('hyj')
print("类:%s,实例:%s,实例字典:%s"%(Foo,f1,f1.__dict__))
###:<class '__main__.Foo'>,实例:<__main__.Foo object at 0x1038ad0f0>,实例字典:{'name': 'hyj'}

元类方法的实现原理

class Mytype(type):
    def __init__(self,a,b,c):
        print("这是元类初始化")
        print(a,b,c)

    def __call__(self, *args, **kwargs):
        #print(self)  #这里的self是Foo这个类
        obj = object.__new__(self) #Foo类皆有object类产生实例,任何类都继承自object
        self.__init__(obj,*args,**kwargs) #触发Foo.__init__(self,name)
        return obj

class Foo(metaclass=Mytype): #Foo = Mytype('Foo',(),{'__init__':__init__}
    def __init__(self,name):
        self.name = name

f1=Foo('hyj')
print(f1.__dict__)

##运行过程
1、当定义Foo类的时候,首先会由元类进行产生,等价于Foo = Mytype('Foo',(),{'__init__':__init__}这个Mytype实例化的过程
2、实例化触发了Mytype的__init__方法
3、当Foo进行实例化的时候,触发了Mytype的__call__方法
4object.__new__这个是由类产生实例的内部方法,借此完成Foo的实例化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值