最近学习了下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. 返回新类
参考:
本文深入探讨了Python元类的概念,解释了如何使用type函数创建类,并通过实例展示了元类如何修改类属性,以及其在拦截类创建、修改类和返回新类中的应用。
4300

被折叠的 条评论
为什么被折叠?



