- 博客(31)
- 资源 (3)
- 收藏
- 关注
原创 使用装饰器扩充类的功能
想通过反省或者重写类定义的某部分来修改它的行为,但是你又不希望使用继承或元类的方式。def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.__getattribute__ # Make a new definition def new_getatt...
2019-01-30 20:46:06 210
原创 装饰类方法和静态方法
装饰类方法或静态方法是很简单的,不过要确保装饰器在 @classmethod 或 @staticmethod 之前。import timefrom functools import wrapsdef timethis(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time()...
2019-01-30 20:45:55 219
原创 装饰器为被包装函数增加参数
在装饰器中给被包装函数增加额外的参数,但是不能影响这个函数现有的调用规则。from functools import wrapsdef optional_debug(func): @wraps(func) def wrapper(*args, debug=False, **kwargs): if debug: print('Calli...
2019-01-22 13:24:07 577
原创 集成类装饰器
使用一个装饰器去包装函数,并返回一个可调用的实例。 装饰器还可以同时工作在类定义的内部和外部。将装饰器定义成一个实例,你需要确保它实现了 _call_() 和 _get_() 方法。import typesfrom functools import wrapsclass Profiled: def __init__(self, func): wraps(func...
2019-01-18 22:52:53 238 1
原创 实现类装饰器
在类中定义装饰器,并将其作用在其他函数或方法上。from functools import wrapsclass A: # Decorator as an instance method def decorator1(self, func): @wraps(func) def wrapper(*args, **kwargs): ...
2019-01-18 22:52:42 213
原创 使用装饰器对函数传参进行类型检查
from inspect import signaturefrom functools import wrapsdef typeassert(*ty_args, **ty_kwargs): """ :param ty_args: :param ty_kwargs: :return: """ def decorate(func): ..
2019-01-18 22:52:33 596
原创 带有可选参数的装饰器
有时候需要写一个装饰器,既可以不传参数给它,也可以传递可选参数给它。from functools import wraps, partialimport loggingdef logged(func=None, *, level=logging.DEBUG, name=None, message=None): if func is None: return par...
2019-01-18 22:52:22 390
原创 自定义带有属性的装饰器
需要写一个装饰器来包装一个函数,并且允许操作者提供参数在运行时控制装饰器行为。from functools import wraps, partialimport loggingdef attach_wrapper(obj, func=None): if func is None: return partial(attach_wrapper, obj) s...
2019-01-18 22:52:08 337
原创 撤销一个装饰器
一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。假设装饰器是通过functools包中的wraps @wraps来实现的,那么可以通过访问 _wrapped_ 属性来访问原始函数:import timefrom functools import wrapsdef Time_D(func): ''' Decorator that reports t...
2019-01-15 21:27:12 207
原创 定义可以接受参数的装饰器
假设你想写一个装饰器,给函数添加日志功能,同时允许用户指定日志的级别和其他的选项。from functools import wrapsimport loggingdef logged(level, name=None, message=None): """ :param level: :param name: :param message: :r...
2019-01-15 21:26:51 309
原创 在函数上添加装饰器
想在已经存在的函数上添加一个装饰器,增加额外的操作处理(比如权限,日志、计时等)。例如:import timefrom functools import wrapsdef Count_Time(func): """ :param func: :return: """ @wraps(func) def wrapper(*args, **k...
2019-01-12 15:47:41 876
原创 类支持比较操作
让某个类的实例支持标准的比较运算(比如>=,!=,<=,<等),但是又不想去实现那一大丢的特殊方法。Python类对每个比较操作都需要实现一个特殊方法来支持。 例如为了支持>=操作符,你需要定义一个 、_ge_() 方法。 尽管定义一个方法没什么问题。装饰器 functools.total_ordering 就是用来简化这个处理的。 使用它来装饰一个来,你只需定义一个 ...
2019-01-11 23:40:16 168
原创 循环引用数据结构-使用弱引用
import weakrefclass Node: def __init__(self, value): self.value = value self._parent = None self.children = [] def __repr__(self): return 'Node({!r:})'.forma...
2019-01-11 23:39:45 252
原创 创建类的缓存实例
在创建一个类的对象时,如果之前使用同样参数创建过这个对象, 这时候不想在创建,而使用之前的实例缓存。你希望相同参数创建的对象是单例的。可以使用 logging 模块,使用相同的名称创建的 logger 实例永远只有一个。例1:import loggingone = logging.getLogger('foo')two = logging.getLogger('bar')one is ...
2019-01-11 23:39:23 343
原创 不用递归实现访问者模式
使用访问者模式遍历一个很深的嵌套树形数据结构,可能会因为超过嵌套层级限制而失败。 可以使用生成器可以在树遍历或搜索算法中消除递归。import typesclass Node(object): passclass NodeVisitor(object): def visit(self, node): stack = [node] las...
2019-01-11 18:00:29 211 1
原创 多种不同方法实现访问者模式
例1:class Node: passclass UnaryOperator(Node): def __init__(self, operand): self.operand = operandclass BinaryOperator(Node): def __init__(self, left, right): self.left...
2019-01-10 22:09:47 178
原创 通过字符串调用对象方法
使用 getattr() 函数。class Person(object): def __init__(self, name, age): self.name = name self.age = age def info(self): return {"name", self.name, "age",...
2019-01-10 22:09:19 902
原创 实现事物状态对象或者状态机制
想实现一个状态机制或者是在不同状态下执行操作的对象,但是又不想在代码中出现太多的条件判断语句。class Connection(object): """新方案——对每个状态定义一个类""" def __init__(self): self.new_state(ClosedConnectionState) def new_state(self, news...
2019-01-09 13:48:15 276
原创 使用Mixins扩展类功能
可以有很多的方法,来扩展其他类的功能。如果这些类并没有任何继承的关系。 因此你不能简单的将这些方法放入一个基类,然后被其他类继承。通常当你想自定义类的时候会碰上这些问题。可能是某个库提供了一些基础类, 你可以利用它们来构造你自己的类。可以使用扩展映射对象,给它们添加日志、唯一性设置、类型检查等等功能。from collections import defaultdict...
2019-01-09 13:39:10 333
原创 创建不需要调用__init__类实例
可以通过 _new_() 方法创建一个未初始化的实例。class Date(object): def __init__(self, year, month, day): self.year = year self.month = month self.day = dayif __name__ == "__main__": d ...
2019-01-08 13:43:24 552
原创 Python类中实现多个构造器
实现多个构造器,可以使用类方法import timeclass Date: """方法一:使用类方法""" # Primary constructor def __init__(self, year, month, day): self.year = year self.month = month self.day = ...
2019-01-08 13:34:41 5229
原创 Python类实现代理访问
加入想将某个实例的属性访问代理到内部另一个实例中去,目的可能是作为继承的一个替代方法或者实现代理模式,简单来说,代理是一种编程模式,它将某个操作转移给另外一个对象来实现。class A(object): def spam(self, x): print(x) pass def foo(self): passclass B(o...
2019-01-05 16:43:31 1685
原创 Python类-自定义容器
实现一个自定义的类来模拟内置的容器类功能,比如列表和字典。可以使用collections模块,定义了很多抽象基类,当你想自定义容器类的时候它们会非常有用。import collectionsimport bisectclass Sorted_Items(collections.Sequence): def __init__(self, initial=None): ...
2019-01-05 16:14:38 990
原创 Python-实现数据模型的类型约束
定义某些在属性赋值上面有限制的数据结构,对赋值时进行各种检查,这种情况最好的方法就是使用描述器。# Base class. Uses a descriptor to set a valueclass Descriptor: def __init__(self, name=None, **opts): self.name = name for key, v...
2019-01-05 13:27:08 1916 2
原创 使用Python类 - 定义接口或者抽象基类
想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法,可以使用 abc 模块可以很轻松的定义抽象基类。from abc import ABCMeta, abstractmethodclass IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): ...
2019-01-02 09:55:43 762
原创 Python类-简化模版
有时候写了很多仅仅用作数据结构的类,不想写太多烦人的_init_() 函数,可以在父类写一个公共的init方法。import mathclass Structure1: # Class variable that specifies expected fields _fields = [] def __init__(self, *args): if ...
2019-01-01 16:22:21 797
原创 Python类使用延迟计算属性
你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。 但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。定义一个延迟属性的一种高效方法是通过使用一个描述器类。class Delayproperty: def __init__(self, func): self.func = func def __get__(self, in...
2019-01-01 15:58:22 546
原创 Python类创建一个自定义数据类型
创建一个新的拥有一些额外功能的实例属性类型,比如类型检查。# Descriptor attribute for an integer type-checked attributeclass String(object): def __init__(self, name): self.name = name def __get__(self, instance,...
2019-01-01 15:36:29 18867
原创 Python子类中扩展父类property
在子类中,你想要扩展定义在父类中的property的功能。class Person: def __init__(self, name): self.name = name # Getter function @property def name(self): return self._name # Setter func...
2019-01-01 15:13:50 801
原创 Python调用父类方法-super
在子类中调用父类的某个已经被覆盖的方法,需要使用 super() 函数。class Parent(object): def spam(self): print('Parent.spam')class Child(Parent): def spam(self): print('Child.spam') super().s...
2019-01-01 14:51:23 7147
原创 Python类中自定义属性验证-创建可管理的属性
给某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。自定义某个属性的一种简单方法是将它定义为一个property。class Name_Check(object): def __init__(self, first_name, last_name): self.first_name = first_name s...
2019-01-01 00:55:18 608
python正则表达式全部方法
2017-09-24
基于django搭建的博客
2017-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人