Python MetaClass元类解析

本文深入探讨了Python元类的概念,解释了如何使用type函数创建类,并通过实例展示了元类如何修改类属性,以及其在拦截类创建、修改类和返回新类中的应用。

最近学习了下MetaClass元类的原理与使用,今天总结下,以备后用。

首先需要树立一个元类的概念。Python中的类其实也是一个对象,不过该对象拥有创建对象的能力。那么普通的class就是从元类metaclass中来。

class ObjectTest(object):
    pass
myobj = ObjectTest()
print myobj
<__main__.ObjectCreate object at 0x000000000341DEF0>

既然普通的类本质上是一个对象,那么也就能对该类进行类似对象的操作,比如创建、修改、传递参数等等。

0x01 类的创建

创建类可以通过type函数,type的声明如下:

    def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
        """
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
        # (copied from class doc)
        """
        pass

type(类名,基类(继承,可以为空),属性字典)

Person = type("Person",(),{"name":"vspiders"})
print  Person().name

当我们想要为类增加函数时,可以这样写

def add(cls,x,y):
    return x+y
Person = type("Person",(),{"name":"vspiders",'add':add})
print hasattr(Person,"add")
print Person().add(1,2)

0x02 元类metaclass

可以理解为Python中所有的类都是通过元类进行创建的。

input:
print Person().__class__.__class__
print int(5).__class__.__class__
print str("a").__class__.__class__

out:
<type 'type'>
<type 'type'>
<type 'type'>

类中有一个__metaclass__属性,每个类对象在创建时都会自下而上的去寻找__metaclass__,如果都没有找到就会使用type创建类对象。

举一个很经典的例子,更改类属性变量为大写

input:
class Person:
    name ="vspiders"
    age = 15
    __metaclass__ = upper_class
    def getage(self):
        # age already change to AGE
        return self.AGE

print hasattr(Person,'age')
print hasattr(Person,'AGE')
print hasattr(Person,"getage")
print Person().GETAGE()

out:
False
True
False
15

其实__metaclass__的作用就是返回一个新的修改后的class。

元类的主要作用在于:

1. 拦截类的创建

2. 修改类

3. 返回新类

 

参考:

https://www.cnblogs.com/Simon-xm/p/4034416.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值