类也是对象

在大多数编程语言中,类就是一组描述如何生成对象的代码段
在Python中这一点仍然成立
>>> class objCreator(object):
...   pass
...
>>> obj1 = objCreator()
>>> obj1
<__main__.objCreator object at 0x0000000002E3C978>
但是,Python中的类远不止如此
类也是一种对象(实例)
是的,没错,就是对象
只要使用关键字class,Python解释器在执行时就会创建一个类对象

可以使用类名作为参数
>>> print(objCreator)
<class '__main__.objCreator'>

可以给其添加属性
>>> objCreator.newAttr = "123"
>>> objCreator.newAttr
'123'
>>> hasattr(objCreator, "newAttr")
True

也可以将类对象赋值为变量
>>> a = objCreator
>>> a.newAttr
'123'

动态创建类

因为类也是对象,所以可以在运行时动态的创建它们
就像其他对象一样
可以在函数中创建类,使用class关键字即可
>>> def generate(name):
...   if name == "func1":
...     class func1(object):
...       pass
...     return func1
...   else:
...     class func2(object):
...       pass
...     return func2
...
>>> a = generate("func1")
>>> a
<class '__main__.generate..func1'>

使用type()来动态创建

>>> help(type)
Help on class type in module builtins:

class type(object)
 |  type(object_or_name, bases, dict)
 |  type(object) -> the object's type
 |  type(name, bases, dict) -> a new type
 |
....
其中type(name, bases, dict) -> a new type就是可以用来创建一个类, 而不是类实例
name是一个字符串, 表示类名
bases是turple, 表示其父类列表
dict是一个字典, 就是各种属性, 函数也可以看做是属性

下面是一个创建类的例子
>>> a = type("classname", (), {})
>>> a
<class '__main__.classname'>

下面是一个创建继承刚才类的类的例子
>>> a = type("classname", (), {})
>>> a
<class '__main__.classname'>
>>> b = type("derivedClass", (a, ), {})
>>> b
<class '__main__.derivedClass'>

例子

单例模式

元类(metaclass)可以控制类的创建过程,
它主要做三件事:
  1. 拦截类的创建
  2. 修改类的定义
  3. 返回修改后的类

1#-*- coding:utf-8 -*-
2
3class Singleton(type):
4    _instances = {}
5    def __call__(cls, *args, **kwargs):
6        if cls not in cls._instances:
7            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
8        return cls._instances[cls]
9
10# Python2
11class Testlass(object):
12    __metaclass__ = Singleton
13
14# Python3
15# class MyClass(metaclass=Singleton):
16#    pass
17
18if __name__ == "__main__":
19    a = Testlass()
20    b = Testlass()
21    print "  id of a = ", id(a)
22    print "  id of b = ", id(b)
23
#-*- coding:utf-8 -*-



class Singleton(type):

    _instances = {}

    def __call__(cls, *args, **kwargs):

        if cls not in cls._instances:

            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)

        return cls._instances[cls]



# Python2

class Testlass(object):

    __metaclass__ = Singleton



# Python3

# class MyClass(metaclass=Singleton):

#    pass



if __name__ == "__main__":

    a = Testlass()

    b = Testlass()

    print "  id of a = ", id(a)

    print "  id of b = ", id(b)

$ python singleton1.py
  id of a =  4524558480
  id of b =  4524558480


如果有任何问题请发邮件到 isteps@126.com


广告内容, 如果不忙, 跪求点击