面向对象高级特性--元类type

1.定义

  • 元类是类的类,是类的模板
  • 元类的实例是类,正如类的实例是对象
  • 元类就是创建类的类,函数type就是元类
  • python中一切皆对象。包括整数、字符串、函数以及类都是对象,且都是从type类创建而来
  • 动态生成类,不能控制类是如何生成的。
  • python3中的metaclass可动态创建类
  • 很多web框架都会使用metaclass来创建类
  • 掌握元类对理解源代码至关重要。比如ORM框架类
    通过__class__的魔术方法可以查看到,float、int、str都是type类的子类
    类的本质是对象,于是可以对类做如下操作:
    (1)可以将它赋值给一个变量
    (2)可以拷贝它
    (3)可以为它增加属性
    (4)可以将它作为函数参数进行传递

2.动态创建类

(1)通过分支语句动态创建类
因为类也是对象,运行时在函数中使用class关键字动态的创建类。当使用class关键字时,python解释器自动创建这个对象。

#通过分支语句动态创建类
def create_class(name):
    if name=='foo':
        class Foo(object):
            pass
        return Foo
    else:
        class Bar(object):
            pass
        return Bar
cls=create_class(name='fool')
print(cls.__name__)  #获取类的方法

结果

Bar

(2)通过type动态创建类
语法格式:
type(类名,父类名称的元组,属性信息的字典)

#通过type动态创建类
def hello(self):
    print('hello')
Person=type('Person',(object,),{'country':'china','hello':hello})
p1=Person()
print(p1.country)
p1.hello()

结果

china
hello

(3)自定义元类metaclass
应用场景:Django(ORM)、元类实现单例模式等
元类本身而言,实现的功能是:1.拦截类的创建 2.修改类 3.返回修改之后的类

#通过metaclass自定义元类
class Singleton(type):
    """自定义元类实现单例模式,父类时type"""
    cache={}
    def __call__(cls):
        if cls not in cls.cache:
            cls.cache[cls]=super(Singleton, cls).__call__()
            # 如果类不在类存储中,则使用父类的__call__方法创建类,这里cls是因为要继承的是类方法,不是实例
        return cls.cache[cls]
#创建一个类Person,指定Person的类(元类)是Singleton
class Person(object,metaclass=Singleton):
    pass
p1=Person()
p2=Person()
print(p1,p2)

结果

<__main__.Person object at 0x00000246F074D9E8> <__main__.Person object at 0x00000246F074D9E8>
#结果显示创建的是单例模式
发布了36 篇原创文章 · 获赞 0 · 访问量 287

猜你喜欢

转载自blog.csdn.net/ANingL/article/details/103932366
今日推荐