文章分类 - Python之石
他山之石
摘要:爬取书架上的书,需用户名登录 import requests import pprint session=requests.session() data={ "loginName":"18614075987", "password":"q6035945" } #登录 url="https://pas
阅读全文
摘要:通过字符串名导入模块 问题 你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。 解决方案 使用 importlib.import_module() 函数来手动导入名字为字符串给出的一个模块或者包的一部分。举个例子: import importlib math = importli
阅读全文
摘要:读取位于包中的数据文件 问题 你的包中包含代码需要去读取的数据文件。你需要尽可能地用最便捷的方式来做这件事。 解决方案 假设你的包中的文件组织成如下: mypackage/ __init__.py somedata.dat spam.py 现在假设 spam.py 文件需要读取 somedata.d
阅读全文
摘要:利用命名空间导入目录分散的代码 问题 你可能有大量的代码,由不同的人来分散地维护。每个部分被组织为文件目录,如一个包。然而,你希望能用共同的包前缀将所有组件连接起来,不是将每一个部分作为独立的包来安装。 解决方案 从本质上讲,你要定义一个顶级 Python 包,作为一个大集合分开维护子包的命名空间。
阅读全文
摘要:将模块分割成多个文件 问题 你想将一个模块分割成多个文件。但是你不想将分离的文件统一成一个逻辑模块时使已有的代码遭到破坏。 解决方案 程序模块可以通过变成包来分割成多个独立的文件。考虑下下面简单的模块: # mymodule.py class A: def spam(self): print('A.
阅读全文
摘要:使用相对路径名导入包中子模块 问题 将代码组织成包, 想用 import 语句从另一个包名没有硬编码过的包中导入子模块。 解决方案 使用包的相对导入,使一个模块导入同一个包的另一个模块举个例子,假设在你的文件系统上有 mypackage 包,组织如下: mypackage/ __init__.py
阅读全文
摘要:控制模块被全部导入的内容 问题 当使用’from module import *’语句时,希望对从模块或包导出的符号进行精确控制。 解决方案 在你的模块中定义一个变量 __all__ 来明确地列出需要导出的内容。举个例子有个模块somemodule.py: def spam(): print('我是
阅读全文
摘要:构建一个模块的层级包 问题 你想将你的代码组织成由很多分层模块构成的包。 解决方案 封装成包是很简单的。在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py 文件。例如: graphics/ __init__.py primitive/ __init__.py line.py
阅读全文
摘要:在局部变量域中执行代码 问题 你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。 解决方案 为了理解这个问题,先试试一个简单场景。首先,在全局命名空间内执行一个代码片段: a = 1 exec('b=a+1') print(b) # 2 然后,再在一个函数中执行同样的代码: de
阅读全文
摘要:单例模式 单例模式即一个类有且仅有一个实例。 普通类创建实例,每创建一个实例解释器就开辟一组内存空间。比如: class Demo: pass a = Demo() b = Demo() print(a) # <__main__.Demo object at 0x0000000002626790>
阅读全文
摘要:为类和静态方法提供装饰器 问题 你想给类或静态方法提供装饰器。 解决方案 给类或静态方法提供装饰器是很简单的,不过要确保装饰器在 @classmethod 或@staticmethod 之前。例如: import time from functools import wraps def timeth
阅读全文
摘要:将装饰器定义为类的一部分 问题 你想在类中定义装饰器,并将其作用在其他函数或方法上。 解决方案 在类里面定义装饰器很简单,但是你首先要确认它的使用方式。比如到底是作为一个实例方法还是类方法。下面我们用例子来阐述它们的不同: class A: def decorator1(self, func): @
阅读全文
摘要:定义一个带参数的装饰器 问题 你想定义一个可以接受参数的装饰器 解决方案 带参数装饰器,其返回值是一个装饰器,用这个装饰器装饰函数之后,可以运行该函数。 def wrapper(n): print('这是外层wrapper函数') def demo(func): print('中层demo函数')
阅读全文
摘要:解除一个装饰器 问题 一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。 解决方案 假设装饰器是通过 @wraps (参考 9.2 小节) 来实现的,那么你可以通过访问__wrapped__ 属性来访问原始函数: from functools import wraps de
阅读全文
摘要:创建装饰器时保留函数元信息 问题 你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了。 解决方案 任何时候你定义装饰器的时候,都应该使用 functools 库中的 @wraps 装饰器来注解底层包装函数。例如: import time from
阅读全文
摘要:在函数上添加包装器 问题 你想在函数上添加一个包装器,增加额外的操作处理 (比如日志、计时等)。 解决方案 如果你想使用额外的代码包装一个函数,可以定义一个装饰器函数,例如: import time def timethis(func): def wrapper(*args, **kwargs):
阅读全文
摘要:通过字符串调用对象方法 问题 你有一个字符串形式的方法名称,想通过它调用某个对象的对应方法。 解决方案 最简单的情况,可以使用 getattr() : import math class Point(object): def __init__(self, x, y): self.x = x self
阅读全文
摘要:创建不调用 init 方法的实例 问题 你想创建一个实例,但是希望绕过执行 __init__() 方法。 解决方案 可以通过 __new__() 方法创建一个未初始化的实例。例如考虑如下这个类: class Date: def __init__(self, year, month, day): se
阅读全文
摘要:在类中定义多个构造器 问题 你想实现一个类,除了使用 __init__() 方法外,还有其他方式可以初始化它。解决方案 为了实现多个构造器,你需要使用到类方法。例如: class Date: def __init__(self, year, month, day): self.year = year
阅读全文
摘要:调用父类方法 问题 你想在子类中调用父类的某个已经被覆盖的方法。 解决方案 为了调用父类 (超类) 的一个方法,可以使用 super() 函数,比如: class A: def spam(self): print('A.spam') class B(A): def spam(self): print
阅读全文