深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式

https://www.cnblogs.com/tkqasn/p/6524879.html

 

一、理解类也是对象

在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:

复制代码

class ObjectCreator(object):
    pass

my_object = ObjectCreator()
print my_object
#输出:<__main__.ObjectCreator object at 0x8974f2c>

复制代码

但是,Python中的类还远不止如此。类同样也是一种对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:

class ObjectCreator(object):
     pass

将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是你可以对它做如下的操作:
你可以将它赋值给一个变量, 你可以拷贝它, 你可以为它增加属性, 你可以将它作为函数参数进行传递。

下面是示例:

复制代码

print ObjectCreator     # 你可以打印一个类,因为它其实也是一个对象
#输出:<class '__main__.ObjectCreator'>

Idef echo(o):
     print o

echo(ObjectCreator)                 # 你可以将类做为参数传给函数
#输出:<class '__main__.ObjectCreator'>
print hasattr(ObjectCreator, 'new_attribute')
#输出:False

ObjectCreator.new_attribute = 'foo' #  你可以为类增加属性
print hasattr(ObjectCreator, 'new_attribute')
#输出:True
print ObjectCreator.new_attribute
#输出:foo

ObjectCreatorMirror = ObjectCreator # 你可以将类赋值给一个变量
print ObjectCreatorMirror()
#输出:<__main__.ObjectCreator object at 0x108551310>

复制代码

 

 二、动态地创建类

1、通过return class动态的构建需要的类

因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。 

复制代码

def choose_class(name):
    if name == 'foo':
        class Foo(object):
            pass
        return Foo     # 返回的是类,不是类的实例
    else:
        class Bar(object):
            pass
        return Bar
MyClass = choose_class('foo')

print MyClass              # 函数返回的是类,不是类的实例
#输出:<class '__main__.Foo'>

print MyClass()            # 你可以通过这个类创建类实例,也就是对象
#输出:<__main__.Foo object at 0x1085ed950

复制代码

2、通过type函数构造类

但这还不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。当你使用class关键字时,Python解释器自动创建这个对象。但就和Python中的大多数事情一样,Python仍然提供给你手动处理的方法。还记得内建函数type吗?这个古老但强大的函数能够让你知道一个对象的类型是什么,就像这样:

复制代码

print type(1)
#输出:<type 'int'>
print type("1")
#输出:<type 'str'>
print type(ObjectCreator)
#输出:<type 'type'>
print type(ObjectCreator())
#输出:<class '__main__.ObjectCreator'>

复制代码

这里,type有一种完全不同的能力,它也能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类。(我知道,根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在Python中是为了保持向后兼容性)

type的语法:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值