1. 元类

  • 类也是对象
    在理解元类之前,我们需要掌握python中的类。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在python中这一点仍然成立:
>>> class Obj(object):
…       pass
…
>>> my_obj= Obj()
>>> print my_obj
<__main__.Obj obj at 0x8974f2c>

但是在python类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只有你使用关键字class,python解释器在执行的时候就会创建一个对象。

  • 动态地创建类
    因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以再函数中创建类,使用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 0x89c6d4c>

但这不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。当你使用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中是为了保持向后兼容性)

tpye可以像这样工作:

type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
Test2 = type("Test2",(),{}) #定了一个Test2类
In [5]: Test2() #创建了一个Test2类的实例对象
Out[5]: <__main__.Test2 at 0x10d406b38>
  • 使用type创建带有属性的类
    type接受一个字典来为类定义属性
>>> Foo = type("Foo",(),{"bar":True})
可以翻译为:
>>> class Foo(object):
...             bar = True

说明:type的第2个参数,元组中是父类的名字,而不是字符串。添加的属性的类属性,并不是实例属性

  • 使用type创建带有方法的类
def echo_bar(self):
        print(self.bar)
#让FooChild类中的echo_bar属性,指向了上面定义的函数
FooChild = type("FooChild",(Foo,),{"echo_bar":echo_bar})
  • 添加静态方法
In [36]: @staticmethod
    ...: def testStatic():
    ...:     print("static method ....")
    ...:
In [37]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic": testStatic})
In [38]: fooclid = Foochild()
In [39]: fooclid.testStatic
Out[39]: <function __main__.testStatic>
  • 添加类方法
In [42]: @classmethod
    ...: def testClass(cls):
    ...:     print(cls.bar)
    ...:
In [43]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic":testStatic, "testClass":testClass})
  • 什么是元类呢?
    元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了python中的类也是对象。好吧,元类就是用来创建这些类(对象)的,元类就是类的类,你可以这样理解为:
MyClass = MetaClass()
MyObject = MyClass()

你已经看到了type可以让你像这样做:

MyClass = type('MyClass', (), {})

这是因为函数type实际上是一个元类。type就是python在背后用来创建所有类的元类。现在你想指定为什么type全部采用小写形式而不是Type呢?好吧这是为了和str保持一致性,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。python中所有的东西,注意,我是指所有的东西–都是对象。这包括整数、字符串、函数以及类。它们全部都是对象。而它们都是一个类创建而来。

2. 内建属性

常用专有属性

说明

触发方式

__init__

构造初始化函数

创建实例后,赋值时使用,在__new__

__new__

生成实例所需属性

创建实例时

__class__

实例所在的类

实例.__class__

__str__

实例字符串表示,可读性

print(类实例),如没实现,使用repr结果

__repr__

实例字符串表示,准确性

类实例 回车 或者 print(repr(类实例))

__del__

析构

del删除实例

__dict__

实例自定义属性

vars(实例.__dict__)

__doc__

类文档,子类不继承

help(类或实例)

__getattribute__

属性访问拦截器

访问实例属性时

__bases__

类的所有父类构成元素

类名.__bases__

3. 库

  • 常用标准库

标准库

说明

builtins

内建函数默认加载

os

操作系统接口

sys

Python自身的运行环境

functools

常用的工具

json

编码和解码 JSON 对象

logging

记录日志,调试

multiprocessing

多进程

threading

多线程

copy

拷贝

time

时间

datetime

日期和时间

calendar

日历

hashlib

加密算法

random

生成随机数

re

字符串正则匹配

socket

标准的 BSD Sockets API

shutil

文件和目录管理

glob

基于文件通配符搜索


  • 常用扩展库

扩展库

说明

requests

使用的是 urllib3,继承了urllib2的所有特性

urllib

基于http的高层库

scrapy

爬虫

beautifulsoup4

HTML/XML的解析器

celery

分布式任务调度模块

redis

缓存

Pillow(PIL)

图像处理

xlsxwriter

仅写excle功能,支持xlsx

xlwt

仅写excle功能,支持xls ,2013或更早版office

xlrd

仅读excle功能

elasticsearch

全文搜索引擎

pymysql

数据库连接库

mongoengine/pymongo

mongodbpython接口

matplotlib

画图

numpy/scipy

科学计算

django/tornado/flask

web框架

xmltodict

xml 转 dict

SimpleHTTPServer

简单地HTTP Server,不使用Web框架

gevent

基于协程的Python网络库

fabric

系统管理

pandas

数据处理库

scikit-learn

机器学习库