![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Python
Jeffrey_bird
一份耕耘,一份收获,每天努力一点点,惊喜终将来临!
展开
-
在类中定义多个构造函数
说到Python中的类构造函数,一般是实现类的__init__方法,用以实例初始化(__new__用作创建实例)。但Python不像Java有很显示的方法重载。因此,若要实现多个不同的构造函数,可能需要另辟蹊径。一个方案是使用类方法classmethod,如下:import timeclass Date: def __init__(self, year, month, ...原创 2020-01-02 23:27:00 · 1321 阅读 · 0 评论 -
实现有状态对象或状态机
想实现一个状态机或可以在许多不同状态下运行的对象,但又不想在代码中添加很多条件。一般通过添加不同状态符号来运行不同状态下的代码,如下:class Connection: def __init__(self): self.state = 'CLOSED' def read(self): if self.state != 'OPEN':...原创 2020-01-05 14:54:00 · 182 阅读 · 0 评论 -
在对象上调用以字符串作为名称的方法
调用对象的方法,一般分为两步,首先查找对象的属性中是否包含该方法名称,然后是调用函数。对于简单的情形,可以使用getattr(),如下:import mathclass Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): ...原创 2020-01-06 23:08:00 · 163 阅读 · 0 评论 -
使类支持比较操作
Python的基础数据类型大多支持比较操作,如 >=, ==, <=等。类对象默认不支持对象间比较操作,除非实现相应的__le__, __eq__, __le__方法等。Python类可以通过为每个比较运算符实现一个特殊的方法来支持比较。 例如,要支持>=运算符,请在类中定义__ge __()方法。 尽管定义单个方法通常没有问题,但是创建每个可能的比较运算符的实现很快...原创 2020-01-27 14:18:00 · 137 阅读 · 0 评论 -
普通装饰器(不带参数)
示例直接给出示例,普通装饰器(即装饰器函数本身不带参数,或参数为实际被包裹的函数):import timefrom functools import wrapsdef timethis(func): ''' Decorator that reports the execution time. ''' @wraps(func) def w...原创 2020-02-03 15:52:00 · 127 阅读 · 0 评论 -
带参数的装饰器
还是直接给出示例,然后再分析:from functools import wrapsimport loggingdef logged(level, name=None, message=None): ''' Add logging to a function. level is the logging level, name is the logger name...原创 2020-02-03 16:05:00 · 140 阅读 · 0 评论 -
定义用户可调整属性的装饰器
编写一个包装函数的装饰器函数,但具有用户可调整的属性,这些属性可用于在运行时控制装饰器的行为。示例如下:from functools import wraps, partialimport logging# Utility decorator to attach a function as an attribute of objdef attach_wrapper(obj,...原创 2020-02-03 17:45:00 · 133 阅读 · 0 评论 -
编写可选参数的装饰器函数
想编写一个装饰器,该装饰器可以不带参数(如@decorator)使用,也可以带可选参数(如@decorator(x,y,z))使用。 但是,由于简单修饰符和带有参数的修饰符之间的调用约定不同,因此似乎没有直接的方法。以下示例解决了这种编程一致性问题:from functools import wraps, partialimport loggingdef logged(fun...原创 2020-02-03 19:41:00 · 156 阅读 · 0 评论 -
使用装饰器进行函数类型检查
动态类型的特性使得Python函数在被调用时,其参数类型不易被知晓。或者,为了动态支持多类型,实际参数的类型由调用者提供。如下:def add(x, y): return x + yprint(add(2, 3)) # 5print(add('Hello', ' World')) # Hello World上面的例子可以看出,函数参数并没有指定类型,使得该函数支持多种类...原创 2020-02-03 21:42:00 · 214 阅读 · 0 评论 -
将装饰器定义为类
import typesfrom functools import wrapsclass Profiled: def __init__(self, func): wraps(func)(self) self.ncalls = 0 def __call__(self, *args, **kwargs): self.n...原创 2020-02-04 19:58:00 · 229 阅读 · 0 评论 -
编写为包装函数添加参数的装饰器
编写一个装饰器,在包装函数的调用签名中添加一个额外的参数。 但是,添加的参数不会干扰该函数的现有调用约定。额外的参数可以通过关键字参数注入到调用签名中,如下:from functools import wrapsdef optional_debug(func): if 'debug' in inspect.getfullargspec(func).args: ...原创 2020-02-04 21:14:00 · 159 阅读 · 0 评论 -
基于特定字段分组记录
有一系列字典或实例,并且希望根据特定字段的值(例如日期)对分组(group)的数据进行迭代。下面有一个子项为字典的序列(list),假如要根据日期(date)进行分组迭代:rows = [ {'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '5148 N CLARK', 'date': '07...原创 2019-08-07 10:05:00 · 70 阅读 · 0 评论 -
过滤序列中的元素
序列中的数据,经常需要提取特定条件的数据,或减少序列中的数据。常用的方式是使用列表生成式(list comprehension),如下:>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]>>> [n for n in mylist if n > 0][1, 4, 10, 2, 3]>>>...原创 2019-08-07 11:25:00 · 110 阅读 · 0 评论 -
提取字典的子集
有时候,需要根据已知的字典对象构造一个新的字典对象。这种场景可以使用字典生成式(dictionary comprehension)。如下:prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75}# Make a dictionary...原创 2019-08-07 14:07:00 · 176 阅读 · 1 评论 -
映射名字到序列元素
通常列表或元组通过位置(索引)来访问元素,但这使得代码有时难以阅读。 通常我们希望通过按名称访问元素来减少对位置的依赖。collections模块的namedtuple()函数(实际上是一个工厂方法)提供了一个tuple的子类,该类拥有tuple的常规操作,同时提供了按名称访问序列元素的能力。命名元组为元组中的每个位置赋予含义,并允许更可读,自我记录的代码。 它们可以在使用常规元组的...原创 2019-08-07 16:16:00 · 103 阅读 · 0 评论 -
序列求值的同时转换(过滤)数据
场景:需要执行缩减函数(例如,sum(),min(),max()),但首先需要转换或过滤数据。通常可以使用生成器表达式进行数据的过滤,sum,min,max的参数为iterable,而generator继承iterator,iterator继承iterable。故生成器表达式同样可以作为这些函数的参数。如下示例:nums = [1, 2, 3, 4, 5]s = sum(x * ...原创 2019-08-07 17:19:00 · 84 阅读 · 0 评论 -
将多个映射组合成单个映射
多个字典或映射,希望在逻辑上将它们组合成单个映射以执行某些操作,例如查找值或检查键是否存在。假如现在有两个字典对象a,b。a = {'x': 1, 'z': 3}b = {'y': 2, 'z': 4}假如现在要检查某一键是否在其中一个字典对象中存在。首先检查a,若a中不存在,则检查b。可以使用collections模块的ChainMap类,如下:from collection...原创 2019-08-07 22:10:00 · 360 阅读 · 0 评论 -
使用装饰器修改类定义
修改类定义可以通过单继承,多继承(mixin),以及元类等。其实,装饰器也可以修改类定义,并且和上述提到的方案相比,更简洁直观,性能也更强。如下:def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.__getattribute__ # Mak...原创 2020-02-04 21:35:00 · 216 阅读 · 0 评论 -
类创建过程
本篇文章用于记录类创建过程相关的文档,可以为以后相关博文的编写提供材料。先在这里做文档备份。官方文档:https://docs.python.org/3.8/reference/datamodel.html#customizing-class-creationPython Cookbook 9.15具体内容:Adding optional keyword arguments to ...原创 2020-02-29 19:30:00 · 262 阅读 · 0 评论 -
元类使用规范
在大型的面向对象程序中,有时将类定义置于元类的控制下会很有用。元类可以检查类的定义,并用于警告程序员可能未引起注意的潜在问题(例如,使用稍微不兼容的方法签名)。有人可能会争辩说,程序分析工具或IDE可以更好地捕获此类错误。可以肯定的是,这样的工具是有用的。但是,如果您要创建供他人使用的框架或库,则通常无法控制他们的开发实践的严格性。因此,对于某些类型的应用程序,如果这样的检查会带来更好...原创 2020-03-01 12:55:00 · 185 阅读 · 0 评论