Python基本语法之元类

版权声明:转载请注明出处及作者! https://blog.csdn.net/chenzhanhai/article/details/84453120

什么是元类

       在Python中,万物均为对象,如整数、字符串、函数以及类都是对象。

       元类就是类的类,也就说元类也是一种对象,只不过是一种特殊的对象。

       当我们使用关键字class时Python在幕后会为我们创建类,而这就是通过元类来实现的,type就是Python在背后用来创建所有类的元类, 也就是说,type是Python的内建元类。

type语法如下:

class type(object)
class type(name, bases, dict)

        一个参数时type返回对象的类, 三个参数时返回新的类对象。

       在一个单数时,参数object为对象。

       在三个参数时,name为新的类的名称,bases为基类的元组,dict字典为类内定义的命名空间变量。元组就是一个不可变的列表(list)。

        如下为type函数示例:

print (type(1))
print (type('shenzhen'))
print (type([2]))
print (type({0:'zero'}))        
print (type( 1 ) == int)
print (int.__class__)
X = type('X', (), {})
print (X)
print (X.__class__)

      示例运行结果如下:

        其中,前四个打印为整型、字符串、列表、字典等基本数据类型类名,第五个为逻辑值。

        int.__class__为int类的类,即为type,说明int类是由type类创建出来的。

        X = type('X', (), {})语句定义了一个新类,类名为X,打印X.__class__,结果仍为type。

        从上例,验证了类的类为type类,该type为元类的结论。

        注:如果你对在打印自定义类时疑惑为何会打印‘__main__.类名’,请查看如下文章链接:

        待更新。

两种类定义方法

         使用传统的类定义方法和元类定义方法示例如下:

class Person:
    pass
  
class X1(Person):
    age = 21
    
X2 = type('X2', (Person,), {'age':21})

print (X1)
print (X2)

print (X1.__dict__)
print (X2.__dict__)

       X1类使用传统的定义方法,X2使用元类定义实现,但X1的定义在执行时,会被Python翻译成X2的方式执行。

      示例执行结果:

自定义元类

       自定义元类,需要知道系统的预定义方法__new__。__new__()方法是类的静态方法,即使没有被加上静态方法装饰器。

       __new__ 是在__init__之前被调用的特殊方法,是用来创建对象并返回之的方法,我们很少用到__new__,除非希望能够控制对象的创建,这里,我们创建的对象是类,我们希望能够自定义它,所以这里改写__new__。

       如下为自定义元类的示例:

class UpperAttrMetaclass(type):
    def __new__(cls, name, bases, dct):
        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
        uppercase_attr = dict((name.upper(), value) for name, value in attrs)
        return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr)

X = UpperAttrMetaclass('X2', (), {'age':21})
print (X.__dict__)

      示例运行结果如下:

如果你喜欢这篇文章,别忘了点赞和评论!

猜你喜欢

转载自blog.csdn.net/chenzhanhai/article/details/84453120