前面几篇博客我都是通过python自省来分析代码并试图得出结论。当然,仅仅通过自省能解决的问题有限,但遇到问题还是不自主的去用这个功能,觉得对于认识代码的含义还是有一定帮助的。而这些自省的知识我都是从python自省指南中学习的。所以,下文的内容基本参考自这份指南,看官可以直接转跳,笔者只是希望通过博客整理自己的思路,检验学习效果。
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
错误: No module named 模块名称 找不到模块,需要将模块添加到Python的搜索目录中。 方法一、在运行时添加参数--pythonpath="路径" 方法二、将路径添加到path中。在settings.py中增加sys.path.insert(0,"path") 方法三、安装模块到python的dist-packages文件夹中
概念 借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性 module2.py #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' class TestClass: def __init__(self): pass def fun(self): pass module1.py 1、不导入模块 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' if __name__ == '__main__': print(globals()) 运行结果 运行结果: {'__author__': 'shouke', '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01F5C310>, '__name__': '__main__', '__builtins__': , '__package__': None, '__doc__': None, '__cached__': None, '__file__': 'F:/project/interface_project/module1.py'} 说明:globals函数返回一个map,map中的key是全局范围内对象的名字,value是该对象的实例 2、导入模块 修改module1.py代码如下 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' import sys if __name__ == '__main__': print(globals()) 运行结果: {'__loader__': <_frozen_importlib.SourceFileLoader object at 0x01D9C310>, 'sys': , '__package__': None, '__builtins__': , '__author__': 'shouke', '__name__': '__main__', '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None} 如上,新增了带颜色部分的内容 3.导入类 修改module1.py代码如下 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' from module2 import TestClass if __name__ == '__main__': print(globals()) 输出结果: {'TestClass': , '__package__': None, '__doc__': None, '__file__': 'F:/project/interface_project/module1.py', '__cached__': None, '__builtins__': , '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01DFC310>, '__author__': 'shouke', '__name__': '__main__'} 如上,新增了带颜色部分的内容 4、结合getattr,callable函数 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' from module2 import TestClass if __name__ == '__main__': # 动态获取类 print('动态获取类:%s'% globals()['TestClass']) print('\n') # 获取类的属性和函数 print(dir(TestClass)) print('\n') print(getattr(TestClass,'fun')) # 获取类的函数对象 print(getattr(globals()['TestClass'](),'attr')) # 获取类实例的属性对象print('\n') print(callable(getattr(TestClass,'fun'))) # 查看类的函数对象是否
安装方法:pip3 install pywifi 安装位置:/usr/local/lib/python3.5/dist-packages/pywifi注意事项:用root账户执行程序,否则会提示PermissionError: [Errno 13] Permission denied: '/var/run/wpa_supplicant'
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。
看到类似的__slots__这种形如__xx__的变量或者函数名就要注意,这些在Python中有特殊用途。
[seemmo@RegionServer1 duwen]$ python Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
— JDK 5.0新增 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? 1. call()可以有返回值的。 2. call()可以抛出异常,被外面的操作捕获,获取异常的信息 3. Callable是支持泛型的
查看宝塔面板的python项目管理器中的网站,已经有uWsgi的模块,但是shell里面运行pip3 list没有uwsgi
2.Python的hasattr() getattr() setattr() 函数使用方法详解
... return 'Student object (name: %s)' % self.name
最近开的坑有点多。有点忙不过来了所以好久没写Blog了。这个C++20的协程接入一直在改造计划中,但是一直没抽出时间来正式实施。 在之前,我写过一个初版的C++20协程接入 《libcopp接入C++20 Coroutine和一些过渡期的设计》 。当时主要是考虑到 Rust也有和C++类似的历史包袱问题,所以参考了一些Rust协程改造过程中的设计。 但是后来尝试在项目中使用的时候发现还是有一些问题。首先C++20的协程并不是零开销抽象,所以强行用Rust的模式反而带来了一定开销和理解上的难度。其次原先的设计中 generator 是按类型去实现外部接入的。但是实际接入SDK的过程中我们有相当一部分类型相同但是接入流程不同的情况,再加上现在各大编译器也都已经让C++20协程的特性脱离 experimental 阶段了,有一些细节有所变化。所以干脆根据我们实际的使用场景,重新设计了下组织结构。
编程环境中的对象很象现实世界中的对象。实际的对象有一定的形状、大小、重量和其它特征。实际的对象还能够对其环境进行响应、与其它对象交互或执行任务。计算机中的对象试图模拟我们身边现实世界中的对象,包括象文档、日程表和业务过程这样的抽象对象。 类似于实际的对象,几个计算机对象可能共享共同的特征,同时保持它们自己相对较小的变异特征。想一想您在书店中看到的书籍。书籍的每个物理副本都可能有污迹、几张破损的书页或唯一的标识号。尽管每本书都是唯一的对象,但都拥有相同标题的每本书都只是原始模板的实例,并保留了原始模板的大
学习使用Django进行网页爬取取决于你对Python、Django框架和网络爬虫的熟悉程度。以下是一些关键点,总的来说,如果你已经具备Python和Django的基础知识,并对网页爬虫有一定了解,那么学习使用Django进行网页爬取将会比较容易。如果你是一个完全的初学者,那么可能需要更多的时间和努力来掌握所需的所有技能。不过,通过逐步学习和实践,这是完全可行的。比如我遇到得下面得问题以及我得应对方法。
怎么理解字典呢?现实生活中的字典可以通过首字母进行查询要查找的汉子,python也可以这样理解,通过”:”前的元素查找到冒号后的元素。
1.abs取绝对值 >>> abs(9.8) 9.8 >>> abs(-9.8) 9.8 2.dic()变为字典类型 >>> dict({"key":"value"}) {'key': 'value'} 3.help()显示帮助信息 >>> help(map) Help on class map in module builtins: class map(object) | map(func, *iterables) --> map object | | Make an iterator tha
到了讲scrapy-redis框架的时候啦,在讲它之前先提出三个问题: 我们要使用分布式,那么分布式有什么优点? Scrapy不支持分布式,是为什么? 如果要使Scrapy支持分布式,需要解决哪些问题? scrapy-redis是怎么解决这些问题的? 接下来,我们逐个回答: 分布式的主要优点包括如下两种: 1)充分利用多机器的宽带加速爬取。 2)充分利用多机的IP加速爬取速度。 在爬虫课堂(十六)|Scrapy框架结构及工作原理章节中,我们已经讲解过Scrapy运行流程,如下图26-1所示: 1)当爬
在ovirt的计算节点上supervdsmd.service是有root用户权限的,可以操作系统底层的资源,其他的服务需要与之通讯来完成对资源的操作。
最近在代码评审的过程,发现挺多错误使用eval导致代码注入的问题,比较典型的就是把eval当解析dict使用,有的就是简单的使用eval,有的就是错误的封装了eval,供全产品使用,这引出的问题更严重,这些都是血淋淋的教训,大家使用的时候多加注意。 下面列举一个实际产品中的例子,详情见bug83055:
Apache Airflow: Write your first DAG in Apache Airflow
这个异常通常都是由mapping中的部分字段类型设置错误,或者索引和映射书写有错误,以及格式错误导致的。
在Python中如果我们不希望类的方法被修改,可以使用@Property装饰器。它可以修饰方法,将该被修饰的方法转为相同名称的只读属性;也可以与属性配合使用,来防止属性被修改。
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上 。
Help on built-in function abs in module __builtin__:
判断对象是否可以被调用,能被调用的对象就是一个callable 对象,比如函数 str, int 等都是可被调用的,但是例子4 中xiaoming这个实例是不可被调用的:
Python 中的装饰器是你进入 Python 大门的一道坎,不管你跨不跨过去它都在那里。
dict类型可以说是python里模块的命名空间,实例的属性,函数的关键字参数都有其的参与。
刚开始学习python的时候,可能会由于命名的不注意,导致也方法一直用不了,原因是在声明变量对的时候和python内置方法冲突了,导致方法被重新定义了,这样一来,方法自然也就不存在了
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
现在已经在2019年,这个时候再来谈Spring MVC的异步模式,好像有点老掉牙了。毕竟现在都Spring5的时代了,甚至将来肯定是webflux的天下了。
bind()方法创建一个新的函数, 当被调用时,它的this关键字被设置为提供的值 ,在调用新函数时,提供任何一个给定的参数序列。
字节数组 字节是计算机的语言,字符串是人类语言,它们之间通过编码表形成一一对应的关系
创建一个 Thread 线程类的子类(子线程),同时重写 Thread 类的 run() 方法
args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递。 kwargs是一个包含关键字参数的字典。 apply()的返回值就是object()的返回值。 apply()的元素参数是有序的,元素的顺序必须和object()形式参数的顺序一致。
原子操作在单个任务单元中执行,而不受其他操作的干扰。在多线程环境中,原子操作是必需的,以避免数据不一致。
保护对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 为了更好的保存属性安全,即不能随意修改,一般的处理方式为 将属性定义为私有属性 添加一个可以调用的方法,供调用 1 class People(object): 2 3 def __init__(self, name): 4 self.__name = name 5 6 def getName(self):
相信在项目中,你一定是经常使用 Redis ,那么,你是怎么使用的呢?在使用时,有没有遇到同我一样,对象缓存序列化问题的呢?那么,你又是如何解决的呢?
下面这个例子基于”廖雪峰的Python教程:分布式进程”原例在Linux上运行,直接在Windows上运行会出现错误,下面是针对原例进行的改进,使之能成功运行。 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431929340191970154d52b9d484b88a7b343708fcc60000#0 博主也对代码注释作了更精确的改进。 原例在Wi
作者:mononite 链接:https://my.oschina.net/mononite/blog/144329(点击文末阅读原文前往) ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为
ThreadLocal是一种实现将变量在各线程之间隔离的方案,也叫线程局部变量表。在Java中每个线程都拥有一个ThreadLocal下的ThreadLocalMap类型的变量,它用来存储定义在线程中的ThreadLocal对象,ThreadLocalMap的键是一个弱引用,指向对应的ThreadLocal对象。但值得每一位Java开发者注意的是ThreadLocal变量如果不及时remove()会造成严重的内存泄露问题。 在JDK 20 Early-Access Build 28版本中便针对ThreadLocal类重新设计了一个ScopedValue类。ScopedValue是一个JDK孵化功能在已发布的JDK20版本中需要手动配置才能使用,ScopedValue的作用是在某些情况下作为ThreadLocal的替代。在同一线程上运行的不同代码可以通过ScopedValue共享不可变的值。ScopedValue主要是为了解决虚拟线程使用ThreadLocal时可能存在的一些问题。 在本期文章中讲会介绍几个ThreadLocal在开发实战中的案例背景以及详细介绍在JDK19中提出的新的并发工具和JDK20正在孵化的ScopedValue类。
在类中的方法前面通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法
测试开发者的共同关注! 作者:jhouyang,腾讯资深后台开发工程师。 WeTest导读 想要升职加薪,强大的专业能力很重要,好的UE要有能力设计好一款PPT,设计不好就要被嘘。那好的测试呢?好的一些测试会靠一手娴熟的Python技巧来升职加薪。本文作者jhouyang早年接触多年Python,通过本文记录早年Python的经验之谈,供大家交流学习。 百度UE总监在2016年国际体验设计大会上演讲被嘘一事已经闹得沸沸扬扬,其被嘘的原因除了主线内容偏题、格局太low、表
大家都知道装饰器是一个很著名的设计模式,经常被用于 AOP (面向切面编程)的场景,较为经典的有插入日志,性能测试,事务处理,Web权限校验, Cache等。
ThreadLocal是一种实现将变量在各线程之间隔离的方案,也叫线程局部变量表。在Java中每个线程都拥有一个ThreadLocal下的ThreadLocalMap类型的变量,它用来存储定义在线程中的ThreadLocal对象,ThreadLocalMap的键是一个弱引用,指向对应的ThreadLocal对象。
数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> divmod(5.5,2) (2.0, 1.5) max:返回可迭代对象中的元素中的最大值或者所有参数的最大值 >>> max(1,2,3) # 传入3个参数 取3个中较大者 3 >>> max('1234') # 传入1个可迭代对象,取其最大元素值 '4' min:返回可迭代对象中的元素中的最小值或者所有参数的最小值 >>> min(1,2,3
领取专属 10元无门槛券
手把手带您无忧上云