自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

原创 Java Socket多线程通信

首先介绍一下用Socket(套接字)实现服务器端和客户端的通信过程 服务器端: 1、创建ServerSocket对象,绑定监听端口 2、通过accept()方法监听客户端请求 3、连接建立后,通过输入流读取客户端发送的请求信息 4、通过输出流向客户端发送相应信息 5、关闭相应资源客户端: 1、创建Socket对象,指明需要连接的服务器的地址和端口号 2、连接建立后,通过输出流向服务器

2015-10-31 15:57:18 379

原创 二叉树遍历

Go代码同时使用递归和迭代实现二叉树遍历package mainimport ( "fmt")type TreeNode struct { Val int Left, Right *TreeNode}type stack []TreeNodefunc (s stack) Push(t TreeNode) stack { return appe...

2020-09-02 23:56:00 109

原创 排序总结图

2020-06-11 09:08:00 126

原创 元类使用规范

在大型的面向对象程序中,有时将类定义置于元类的控制下会很有用。元类可以检查类的定义,并用于警告程序员可能未引起注意的潜在问题(例如,使用稍微不兼容的方法签名)。有人可能会争辩说,程序分析工具或IDE可以更好地捕获此类错误。可以肯定的是,这样的工具是有用的。但是,如果您要创建供他人使用的框架或库,则通常无法控制他们的开发实践的严格性。因此,对于某些类型的应用程序,如果这样的检查会带来更好...

2020-03-01 12:55:00 176

原创 类创建过程

本篇文章用于记录类创建过程相关的文档,可以为以后相关博文的编写提供材料。先在这里做文档备份。官方文档: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 258

原创 使用装饰器修改类定义

修改类定义可以通过单继承,多继承(mixin),以及元类等。其实,装饰器也可以修改类定义,并且和上述提到的方案相比,更简洁直观,性能也更强。如下:def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.__getattribute__ # Mak...

2020-02-04 21:35:00 214

原创 编写为包装函数添加参数的装饰器

编写一个装饰器,在包装函数的调用签名中添加一个额外的参数。 但是,添加的参数不会干扰该函数的现有调用约定。额外的参数可以通过关键字参数注入到调用签名中,如下:from functools import wrapsdef optional_debug(func): if 'debug' in inspect.getfullargspec(func).args: ...

2020-02-04 21:14:00 157

原创 将装饰器定义为类

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 224

原创 使用装饰器进行函数类型检查

动态类型的特性使得Python函数在被调用时,其参数类型不易被知晓。或者,为了动态支持多类型,实际参数的类型由调用者提供。如下:def add(x, y): return x + yprint(add(2, 3)) # 5print(add('Hello', ' World')) # Hello World上面的例子可以看出,函数参数并没有指定类型,使得该函数支持多种类...

2020-02-03 21:42:00 210

原创 编写可选参数的装饰器函数

想编写一个装饰器,该装饰器可以不带参数(如@decorator)使用,也可以带可选参数(如@decorator(x,y,z))使用。 但是,由于简单修饰符和带有参数的修饰符之间的调用约定不同,因此似乎没有直接的方法。以下示例解决了这种编程一致性问题:from functools import wraps, partialimport loggingdef logged(fun...

2020-02-03 19:41:00 146

原创 定义用户可调整属性的装饰器

编写一个包装函数的装饰器函数,但具有用户可调整的属性,这些属性可用于在运行时控制装饰器的行为。示例如下: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 131

原创 带参数的装饰器

还是直接给出示例,然后再分析: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 138

原创 普通装饰器(不带参数)

示例直接给出示例,普通装饰器(即装饰器函数本身不带参数,或参数为实际被包裹的函数):import timefrom functools import wrapsdef timethis(func): ''' Decorator that reports the execution time. ''' @wraps(func) def w...

2020-02-03 15:52:00 122

原创 Python装饰器(不带参数)

示例直接给出示例,普通装饰器(即装饰器函数本身不带参数,或参数为实际被包裹的函数):import timefrom functools import wrapsdef timethis(func): ''' Decorator that reports the execution time. ''' @wraps(func) def w...

2020-02-03 15:52:00 178

原创 使类支持比较操作

Python的基础数据类型大多支持比较操作,如 >=, ==, <=等。类对象默认不支持对象间比较操作,除非实现相应的__le__, __eq__, __le__方法等。Python类可以通过为每个比较运算符实现一个特殊的方法来支持比较。 例如,要支持>=运算符,请在类中定义__ge __()方法。 尽管定义单个方法通常没有问题,但是创建每个可能的比较运算符的实现很快...

2020-01-27 14:18:00 132

原创 在对象上调用以字符串作为名称的方法

调用对象的方法,一般分为两步,首先查找对象的属性中是否包含该方法名称,然后是调用函数。对于简单的情形,可以使用getattr(),如下:import mathclass Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): ...

2020-01-06 23:08:00 158

原创 实现有状态对象或状态机

想实现一个状态机或可以在许多不同状态下运行的对象,但又不想在代码中添加很多条件。一般通过添加不同状态符号来运行不同状态下的代码,如下:class Connection: def __init__(self): self.state = 'CLOSED' def read(self): if self.state != 'OPEN':...

2020-01-05 14:54:00 176

原创 在类中定义多个构造函数

说到Python中的类构造函数,一般是实现类的__init__方法,用以实例初始化(__new__用作创建实例)。但Python不像Java有很显示的方法重载。因此,若要实现多个不同的构造函数,可能需要另辟蹊径。一个方案是使用类方法classmethod,如下:import timeclass Date: def __init__(self, year, month, ...

2020-01-02 23:27:00 1285

原创 代理属性访问

代理属性访问通常作为类继承的一种替代,最简单的代理属性访问代码如下:class A: def spam(self, x): pass def foo(self): passclass B: def __init__(self): self._a = A() def spam(self, x): ...

2020-01-02 22:41:00 120

原创 实现自定义容器类型

想要实现一个自定义类,该类模仿普通的内置容器类型(例如list或dict)的行为。 但是,不确定要实现哪种方法。collections.abc模块定义了各种抽象基类,这些基类在实现自定义容器类时非常有用。自定义类一般通过继承该模块的对应基类,然后实现所需要的类方法。如下:from collections.abc import Iterableclass A(Iterable):...

2020-01-01 23:45:00 236

原创 实现数据模型或类型系统

想定义各种类型的数据结构,但是要对允许分配给某些属性的值实施约束。在此问题中,基本上要面对某些实例属性的设置进行检查或声明。 为此,需要基于每个属性自定义属性的设置,此时应该使用描述符。一般通过类及类的继承系统来实现,如下示例:# Base class. Uses a descriptor to set a valueclass Descriptor: def __init_...

2019-12-29 23:36:00 205

原创 简化数据结构的初始化

有时候,我们会厌倦为无数的class编写__init__函数,而__init__函数的作用仅是为了初始化一些属性。我们可以编写一个父类来约定子类的__init__方式,根据类属性列表来一一初始化。class Structure: _fields = [] def __init__(self, *args): if len(args) != len(se...

2019-12-29 20:59:00 175

原创 使用缓存的计算属性

在Python中,将方法变为属性使用@property的装饰器。有时候,为了提高性能,想在仅首次调用方法property时进行计算,后续则使用缓存的值。此时,可以使用一个类装饰器,如下:class LazyProperty: def __init__(self, func): self.func = func def __get__(self, in...

2019-12-29 18:58:00 114

原创 Java多线程死锁

为了确保线程的安全,我们会通过对象锁来实现线程中共享数据的同步。但是对象锁引起的等候很容易导致另一种问题,那就是“死锁”。所谓“死锁”就是指两个或者两个以上的线程都在等待对方释放对象资源而进入一种不可调节的状态。在程序设计中,死锁是无法预知和无法避免的,这就像我们不知道计算机操作系统什么时候会死锁一样,尽管这种情况并非经常出现,但是一旦碰到,应用程序的调试讲变得异常艰难。死锁是多线程编程的产物,我

2019-12-21 10:54:43 332

原创 扩展子类的属性

子类继承父类的时候,可以继承并重写父类的property,如下所示:class Person: def __init__(self, name): self.name = name # Getter function @property def name(self): return self._name # S...

2019-12-15 15:28:00 255

原创 Python调用继承类方法super()

非常牛的参考文章:Python’s super() considered super介绍众所周知,Python作为高级语言,既支持单继承,且支持多继承。在单继承中,如果子类想调用父类,可以使用super()。官方解释:super()返回将方法调用委托给类型的父类或同级类的代理对象。 这对于访问已在类中重写的继承方法很有用。原型:Init signature: super(se...

2019-12-13 16:16:00 405

原创 创建可管理的类属性

对实例属性的set或get进行额外的处理(例如,类型检查或验证)。可以使用类property对属性进行set,get,delete的定制化。类签名如下:class property(fget=None, fset=None, fdel=None, doc=None)返回一个property的属性,fget是用于获取属性值的函数。 fset是用于设置属性值的功能。 fdel是用于删除...

2019-12-08 16:43:00 103

原创 访问在闭包内部定义的变量

闭包函数(嵌套函数):通常想使用允许访问和修改内部变量的函数来扩展闭包。通常,闭包的内部变量完全对外界隐藏。但是,可以通过编写访问器函数并将它们作为函数属性附加到闭包来提供访问。也即为闭包函数提供函数属性。如下:def sample(): n=0 # Closure function def func(): print('n=', n) ...

2019-12-05 23:22:00 491

原创 带有额外状态的回调函数

编码中常碰到的一个情形是需要编写回调函数,如事件处理函数等。一般的回调函数如常规函数,传递参数,返回计算的值。def apply_async(func, args, *, callback): # Compute the result result = func(*args) # Invoke the callback with the result ...

2019-12-04 23:33:00 75

原创 函数相关注意事项

默认参数值的陷阱默认参数值在函数定义的时候并得到计算,如下:i = 5def f(arg=i): print(arg)i = 6f()最后输出的结果为5,因为默认值已在函数定义时得到计算。重要警告:默认值仅被计算一次。 当默认值是可变对象(例如列表,字典或大多数类的实例)时,这会有所不同。 例如,以下函数累积在后续调用中传递给它的参数:def f(a, L=[...

2019-11-29 00:07:00 90

原创 Python函数参数

Python函数参数有三种格式,并且可以组合使用。默认参数值最常用的格式是给一个或多个参数名称添加默认值。如下所示:def ask_ok(prompt, retries=4, reminder='Please try again!'): while True: ok = input(prompt) if ok in ('y', 'ye', ...

2019-11-28 22:26:00 176

原创 将排序序列的集合合并成一个排序序列

您有一个排序序列的集合,并且想要遍历所有合并在一起的排序序列。先看如下示例,了解实际需求:>>> import heapq>>> a = [1, 4, 7, 10]>>> b = [2, 5, 6, 11]>>> for c in heapq.merge(a, b): print(c)....

2019-11-09 16:28:00 299

原创 展平嵌套序列

需求:将[1, 2, [3, 4, [5, 6], 7], 8]按顺序输出:1 2 3 4 5 6 7 8。可以编写如下代码:from collections import Iterabledef flatten(items, ignore_types=(str, bytes)): for x in items: if isinstance(x, Iter...

2019-11-09 16:09:00 84

原创 同时迭代不同的容器元素

当有多个不同的序列(container)需要进行迭代时,常见的方式是写多个for循环语句,或者编写如下的代码:def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E E for it in iterables: for element in it: yield e...

2019-11-09 15:53:00 95

原创 同时迭代多个序列

将多个序列结合起来一起迭代,可以使用内置的zip函数,如下:>>> xpts = [1, 5, 4, 2, 10, 7]>>> ypts = [101, 78, 37, 15, 62, 99]>>> for x, y in zip(xpts, ypts): print(x, y)...1 1015 784...

2019-11-06 23:00:00 125

原创 遍历所有可能的组合或排列

首先来看集合的所有排列情形,itertools模块提供了permutations函数。示例如下:>>> items = ['a', 'b', 'c']>>> from itertools import permutations >>> for p in permutations(items):... print(p)...

2019-11-06 22:30:00 1020

原创 迭代器迭代 —— itertools.dropwhile

有的时候,我们想基于迭代器的某个特定元素开始进行迭代。也就是说,在这个元素之前的元素都跳过。itertools提供了一个dropwhile方法:itertools.dropwhile(predicate, iterable)Make an iterator that drops elements from the iterable as long as the predicate ...

2019-11-06 22:12:00 237

原创 迭代器切片操作

迭代器对象一般来说是不支持像可迭代对象(list,tuple等)的切片操作。如下示例:def count(n): while True: yield n n += 1c = count(0)c[10:20]Trackback(most recent call last): File "<stdin>", line 1, in...

2019-11-06 21:54:00 144

原创 字符串查找替换

查找在字符串中匹配和搜索指定文本的常用方案是使用字符串的find, startswith, endswith等方法。如下示例:>>> text = 'yeah, but no, but yeah, but no, but yeah'>>> # Exact match >>> text == 'yeah' False&gt...

2019-08-09 14:23:00 201

原创 使用Shell通配符模式匹配字符串

问题希望使用与在Unix shell中常用的相同通配符模式匹配文本(例如,.py,Dat [0-9].csv等)。方案fnmatch模块提供了两个函数fnmatch和fnmatchcase。唯一的区别是是否区分字母大小写。示例如下:>>> from fnmatch import fnmatch, fnmatchcase>>> fnmatch(...

2019-08-08 15:40:00 842

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除