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. 内建属性
常用专有属性 | 说明 | 触发方式 |
| 构造初始化函数 | 创建实例后,赋值时使用,在 |
| 生成实例所需属性 | 创建实例时 |
| 实例所在的类 | 实例. |
| 实例字符串表示,可读性 | print(类实例),如没实现,使用repr结果 |
| 实例字符串表示,准确性 | 类实例 回车 或者 print(repr(类实例)) |
| 析构 | del删除实例 |
| 实例自定义属性 | vars(实例. |
| 类文档,子类不继承 | help(类或实例) |
| 属性访问拦截器 | 访问实例属性时 |
| 类的所有父类构成元素 | 类名. |
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 | 机器学习库 |