首页 文章 精选 留言 我的

精选列表

搜索[全基因组选择],共10011篇文章
优秀的个人博客,低调大师

rtmp/rtsp直播播放器选择

相信大家在做rtmp、rtsp直播的时候,最大的困惑就是选个靠谱的播放器,直播的延迟,一定意义上说,90%的取决于播放器的好坏。 以下是推荐的大牛直播跨平台播放器SDK(windows/android/iOS),大家可以在调试的时候,参考他们的播放,测试推送或者server端性能。 支持功能列表: windows播放器/android播放器/iOS播放器 超低延迟的rtmp播放器; 超低延迟的rtsp播放器; 完美支持多实例播放(启动多实例,同时播放多路流,如同时播放多路rtmp/rtsp流); 支持RTSP TCP/UDP模式切换; 支持播放端,buffer设置; 支持秒开模式; windows双击画面进入全屏模式; video支持H.264,audio支持aac/speex/pcma/pcmu播放; Windows支持RTSPH.265播放; windows/android/iOS平台均支持回调音视频数据(Video:H.264/YUV Audio:aac/speex/pcma/pcmu)到上层; 支持自定义播放布局; 音视频多种render机制; 支持播放过程中,'实时静音/取消静音'; 支持播放端视频view实时旋转(0° 90° 180° 270°)、水平反转、垂直反转; 支持播放过程中快速切换URL; 支持播放端录像,或只录像不播放,同等配置的流,切换url依旧可以录制到同一个文件; 播放过程中,音视频信息改变后自动适配; android/iOS支持软硬解码,业内真正靠谱的超低延迟、低资源占用播放rtsp/rtmp 1080p+; [快照]支持播放/录像过程中,随时快照; [windows点播播放器]支持本地flv文件播放(支持获取flv文件的duration(时长);支持显示当前播放位置;支持开始播放或播放过程中seek(跳转播放位置),也许是行业内seek最快的flv点播播放器。) 支持针对类似于娃娃机直播方案的超低延迟模式设置(公网200~400ms)。

优秀的个人博客,低调大师

Android RTMP直播推流方案选择

1. 技术科普: RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。 2. 可选方案: 利用FFmpeg进行直播推流(优点:对技术开发者来说,会有在不断的填坑过程中,提升自我;缺点:产品稳定性差,延迟大); 利用第三方SDK(大牛直播github地址)(优点:延迟小,非常稳定,适用于产品快速上线,有专人维护;缺点:商业授权需要一定费用)。

优秀的个人博客,低调大师

为什么选择ali-E-MapReduce

介绍 E-MapReduce是构建于阿里云ECS弹性虚拟机之上,利用开源大数据生态系统,包括但不限于Hadoop、Spark、Hbase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。我们提供的软件基本都是开源的软件,会有一些性能的优化,但是绝对不引入任何不兼容的改动。具体实施可以参考:https://www.aliyun.com/product/emapreduce Hadoop可以处理哪些场景 Hadoop as a service的概念提出由来已久,当前99.9%的公司都在使用Hadoop。目前可以处理几乎所有的场景,如:ETL、实时流式处理、实时查询、机器学习等场景。当前,在阿里云E-MapReduce中,每个场景都有一些用户在使用,后续我们也会提供一些典型的场景给您作为参考。 为什么需要上云 针对这个问题可能业界已经

优秀的个人博客,低调大师

AOP编程全解析

AOP是一种编程思想,一套规范。 软件开发经历了面向过程编程时代,以C语言为代表,之后是面向对象编程时代,以Java语言为代表。 在21世纪大牛们又提出了一种新的编程思想面向方面编程,即AOP理念,全称Aspect-Oriented Programming。 AOP是第三代编程思想,到哪免不了都要问下。 发展历史 1997年在面向对象编程大会上Gregor Kiczales等人首次提出了AOP的概念,之后各大公司等分别加入研究。2001年Palo Alto研究中心发布了首个支持AOP的语言AspectJ,同时也是一个规范。 目标定位 在对真实世界抽象的面向对象编程过程中,始终伴随着某写操作的代码无法实现模块化封装,会散落在各个对象中存在,特别是非功能性代码。对于一般的功能开发采取面向对象方式进行抽象是能够很好应付的,但是面向方面(切面)给了一种新的思维方式来考虑编程,能更好的进行全局结构化思考。 所以AOP主要解决两个问题: 代码分散问题,特别是那些非功能性代码。 作为面向对象编程思维的一种补充和完善。 核心知识点 连接点 连接点:join point,程序的一个执行点,如类中的一个方法,方法里面一个代码块。 切入点 切入点:point cut,是一个捕获连接点的代码结构,就是定义一个代码逻辑用来捕获某个连接点的代码。 方面 方面;aspect,是具体被执行的切面逻辑代码,类似于一个类。 通知 通知:advice,是point cut执行的代码,定义在连接点什么时机来执行aspect。 主要运用场景 场景分为2类: 一类是非功能性需求,如日志、异常、安全、事务都可以使用AOP思想编程。 另一类是功能性需求,在原来对象抽象的思维中添加AOP思维,这里是一种结构化思维,在定义类时考虑多个类的切面共性。 主流AOP语言实现 对AOP实现除了AspectJ外,已知的还有JBoss AOP、Spring AOP等。 这里只介绍AspectJ和SpringAOP,重点是他们不同点。 AspcetJ AspectJ采用静态织入方式进行切面织入原代码,提供独立的编译器把切面和原代码的java文件编织成一个新的class文件。提供了详细的编译日志和调试工具,编译时间长但是运行效率高。 连接点的支持范围: 方法和构造器调用 方法和构造器执行 属性访问 异常处理 类初始化,是static代码块 语法结构 控制流 对象及参数类型 条件测试 关联连接点通知方式: before,连接点执行前运行 after,连接点执行后运行 around,连接点的整个外侧,整个包住,能够绝的连接点执行和修改上下文环境 Spring AOP Spring AOP没有完全实现AspectJ语言,它更多的是对Spring framwork进行Aop能力的扩展实现,补全Spring framework的不足并让Aop与Spring framwork融合。 连接点只支持方法拦截调用。 连接点通知方式在aspect的before、after、around的基础上增加throw对异常的触发的拦截。 Spring AOP与Spring IoC体系融合,对于aspect类统一交由Spring beans管理,并且提供ProxyFactoryBean的AOP代理工厂类,还有自动代理的BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator的强大工具。 Spring AOP是动态织入,在运行时完成AOP的aspect代码织入原代码逻辑中。其底层默认采用JDK的动态代理实现AOP代理,当对象没有实现接口时,CGLIB会默认使用。 优缺点 优点:解决代码散乱问题、代码逻辑解偶、易于维护、提供扩展性和可重用性。 缺点:切面越多系统越复杂难懂、工程师学习成本增加(业务不再是线型,变成了跳跃式) AOP编程要慎重使用,作为面向对象编程的一种补充。 作者:Owen Jia 关注他的博客:https://blog.shareworld.vip

优秀的个人博客,低调大师

Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a=b 2.深拷贝:首先要import copy,然后c = copy.deepcopy(a),就表示把a的内容深拷贝到c中,如果发现了a中也存在引用的内容,则递归拷贝,也就是把当前的这个引用的对象继续深拷贝 3. copy和deepcopy的区别 ①copy:浅拷贝,里面如果有可变类型,修改这个可变类型(如list),被拷贝的对象也会相应改变,仅仅拷第一层,如果是不可变类型,就一层都不拷,如果是可变类型就拷一层 ②deepcopy:深拷贝,里面不管是可变类型和不可变类型,被拷贝的对象都不会受到影响,递归拷贝 4.copy和deepcopy拷贝元组的特点 使用copy模块的copy功能的时候,它会根据当前拷贝的数据类型是可变类型还是不可变类型有不同的处理方式,如元组是不可变类型,拷贝多份没有用,对copy来说,如果是可变类型就拷一层,如果是不可变类型,就一层都不拷 属性property 1.属性property-1 ①私有属性添加getter和setter方法 ②使用property升级getter和setter方法 num=property(getNum,setNum) 注意: Num到底是调用getNum()还是setNum(),要根据实际的场景来判断,值得注意的是一定要先填getNum后setNum 如果是给t.num赋值,那么一定调用setNum() 如果是获取t.num的值,那么就一定调用getNum() property的作用:相当于把方法进行了封装,开发者在对属性设置数据的时候更方便 2.属性property-2 classMoney(object): @property#修饰器 defnum(self): print("------getter-----") returnself.__num @num.setter#修饰器 defnum(self,new_num): print("------setter------") self.__num=new_num t.num=20 print(t.num) 迭代器 1.迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退 2.可迭代对象(for 循环遍历的数据类型) ①一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等 ②一类是 generator(列表生成式,生成器) ,包括生成器和带 yield 的generator function ③这些可以直接作用于for循环的对象统称为可迭代对象:Iterable fromcollectionsimportIterable #如果可以迭代就返回True isinstance([],Iterable) 3.判断是否可以迭代 可以使用isinstance()判断一个对象是否是Iterable对象 fromcollectionsimportIterable #如果可以迭代就返回True isinstance([],Iterable) 而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了 4.迭代器 ①可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator ②可以使用isinstance()判断一个对象是否是Iterator对象 ③生成器(i for i in range(10))一定是迭代器,但迭代器不一定是生成器 ④迭代器一定是可迭代对象,但可迭代对象不一定是迭代器 fromcollectionsimportIterator isinstance((xforxinrange(10)),Iterator)#如果是的话就返回True 5.iter( )函数 ①生成器都是Iterator(迭代器)对象,但 list、dict、str虽然是Iterable(可迭代),却不是Iterator(迭代器) ②把list、dict、str 等 Iterable(可迭代)变成 Iterator(迭代器)可以使用iter()函数,就好比人可以游泳,但不是天生就会,可迭代对象就好比人,迭代器就好比会游泳的人,需要经过iter()训练一样 isinstance(iter([ ]),Iterator) True 闭包 1.函数的引用 test1()#调用函数 ret=test1#引用函数 ret()#通过引用调用函数 2.什么是闭包 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 deftest(number): print("-----1-----") deftest_in(number2): print("----2-----") print(number+number2) print("------3------") #把函数的引用返回了 returntest_in #用来接收test(100),指向了一个函数体,这个100传给了number ret=test(100) #这个1传给了number2 ret(1) #这个返回101 ret(100) #这个返回200 ret(200) #这个返回300 3.闭包再理解 内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包 闭包的实际例子: defline_conf(a,b): defline(x): returna*x+b returnline line1=line_conf(1,1) line2=line_conf(4,5) print(line1(5)) print(line2(5)) 这个例子中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用 装饰器 1.装饰器 在有两个重名的函数中,Python解释器会调用最后定义的那重名函数,因为在Python里,第一个函数指向的是一片内存,然后又让这个函数指向另一片内存,就会利用第二片内存来执行,所有函数名应尽量避免相同 写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: ①封闭:已实现的功能代码块 ②开放:对扩展开发 ③实例: defw1(func): definner(): #验证1 #验证2 #验证3 func() returninner @w1 #装饰器 deff1(): print('f1') @w1#装饰器 deff2(): print('f2') ........ 对于上述代码,也是仅仅对基础平台的代码进行修改,就可以实现在其他人调用函数 f1、 f2 、f3 、f4 之前都进行【验证】操作,并且其他业务部门无需做任何操作 2.装饰器的功能 ①引入日志 ②函数执行时间统计 ③执行函数前预备处理 ④执行函数后清理功能 ⑤权限校验等场景 ⑤缓存 ⑥如果是有多个装饰器的情况,一般是先装饰最下面的一个,然后依次往上,@w1类比于f1 = w1(f1) 3.装饰有参数的函数:在传递参数的时候,需要在闭包里面定义一个形参,闭包里面的调用的函数也要定义一个形参,否则会导致两部分函数调用失败 4.装饰不定长的参数的函数:在传递参数的时候,需要在闭包里面定义一个*args和**kwargs,闭包里面的调用的函数也要定义一个*args和**kwargs,这样就可以在调用的时候传递任意长度的参数,增加代码的可复用性 5.装饰带返回值的函数:需要在闭包里面进行一个接收,也就是ret = test(),然后再把接收到的ret return出去,这样在装饰的test才能返回出当前需要返回的东西,否则只会返回None 6.通用的装饰 defw1(func): print("-----正在装饰-----") definner(*args,**kwargs): print("---正在验证权限---") print("----记录日志----") ret=func(*args,**kwargs) returnret returninner 带有参数的装饰器:也就是在原来包含一个闭包的函数外面再给他套一个函数,用来传递装饰器的参数 deffunc_arg(arg): defw1(func): print("---记录日志---") definner(*args,**kwargs): func(*args,**kwargs) returninner returnw1 @func_arg("heihei") deff1(): print("----f1----") #1.先执行func_arg("heihei")函数,这个函数return的结果是 #2.@w1 #3.使用@w1对f1进行装饰 #作用:带有参数的装饰器,能够起到在运行时,有不同的功能 python是动态语言 1.Python是动态语言 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。这种动态语言的应用就好比是在没有更新app的情况下,它的界面在后台也可以被开发者更改,因为它是动态的,可以把新增的动态程序放置在文本,只要加载一遍即可 2.运行的过程中给对象绑定(添加)属性:也就是说给对象绑定一个实例属性(这个属性是初始化之外的额外属性),只有这个创建对象的属性如laozhao.addr = "北京" 3.运行的过程中给类绑定(添加)属性:如果需要所有的一个类的实例加上一个属性怎么办呢? 答案就是直接给这个类绑定属性,如Person.sex = "male" 4.运行的过程中给类绑定(添加)方法: 如果是对这个类绑定一个实例方法,那么就要先import types,然后如对象.方法名 = types.MethodType(函数名, 对象),把run这个方法绑定到P对象上。如果是静态方法和类方法,就直接用类名.方法名=函数名 5.运行的过程中删除属性、方法: ①del 对象.属性名 ②delattr(对象, "属性名") __slots__的作用 1.动态语言:可以在运行的过程中,修改代码 2.静态语言:编译时已经确定好代码,运行过程中不能修改 3.为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性,如__slots__ = ("name","age"),就可以达到限制name和age的属性,如果发现有添加其他属性的程序就会发生异常 4.使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的 生成器 1.什么是生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了 ①while的列表推导 list.append(i) ②for的列表推导,range与切片很类似 foriinrange(10,78): ③第一个i是元素的值,后面的for是循环的次数,如果第一个i=11,那么所有的元素都是11 a=[iforiinrange(1,18)] ④for控制循环的次数,for和if的嵌套 c=[iforiinrange(10)ifi%2==0] ⑤每执行第一个for循环都要执行第二个for循环的所有次数 d=[iforiinrange(3)forjinrange(2)] ⑥每执行第一个for循环都要执行第二个for循环的所有次数 d=[(i,j)foriinrange(3)forjinrange(2)] 例题:找出100以内能被3整除的正整数 aiquot=[] forninrange(1,100) ifn%3==0: aiquot.append(n) range(3,100,3)#很简洁 2.创建生成器方法1 要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生成式的[ ]改成( ) 如L = [ x*2 for x in range(5)]和G = ( x*2 for x in range(5)),L是一个列表,而G是一个生成器,可以通过next(G)函数获得生成器的下一个返回值,不断调用 next()实在是太变态了,正确的方法是使用for循环,因为生成器也是可迭代对象 3.创建生成器方法2 fib函数变成generator,只需要把print(b)改为yield b就可以了,循环过程中不断调用yield ,就会不断中断。当然要给循环设置一个条件来退出循环,不然就会产生一个无限数列出来,当循环到没有元素的时候,将会生成异常,这时候就要用try和exception来检测异常,#print自动检测异常并停止,但是next()就要用try ,在创建生成器的时候需要接收函数的返回值 #1.next(返回函数名) #2.返回函数名.__next__()是一样的方法来获取下一个返回值 总结:生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次或第 n 次调用跳转至该函数中间,而上次调用的所有局部变量都保持不变,生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置 4.生成器的特点 ①节约内存 ②迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的 5.send用法 ①如果在在程序中有个变量等于yield,不是说把yield的值给了这个变量,而是接下来在下一次调用执行一次的时候可以传一个值,t.send("haha")和t.__next__()都可以让生成器继续执行,不同的是send可以传递一个值,但是不能在程序刚开始执行就用send传值,有两种方法,要么先用__next__调用一次,再send一个值,或者t.send(None) ②生成器:完成多任务,控制多个任务执行的情况 元类 1.元类 ①类也是对象 ②在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段,类同样也是一种对象 2.动态的创建类 因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样 defchoose_class(name): ifname=='foo': classFoo(object): pass returnFoo#返回的是类,不是类的实例 else: classBar(object): pass returnBar MyClass=choose_class('foo')#当你使用class关键字时,Python解释器自动创建这个对象 2.使用type创建类 ①type还有一种完全不同的功能,动态的创建类,type可以像这样工作: ②type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) Test2=type("Test2",(),{})#定了一个Test2类 3.使用type创建带有属性的类 Foo=type('Foo',(),{'bar':True}) 4.使用type创建带有方法的类 FooChild=type('FooChild',(Foo,),{'echo_bar':echo_bar})#这是添加实例方法echo_bar Foochild=type('Foochild',(Foo,),{"echo_bar":echo_bar,"testStatic":testStatic})#添加静态方法 Foochild=type('Foochild',(Foo,),{"echo_bar":echo_bar,"testStatic":testStatic,"testClass":testClass})#添加类方法 5.到底什么是元类 元类就是用来创建类的东西,元类就是用来创建这些类 (对象) 的,元类就是类的类,元类又由元类创建,Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类 6.__metaclass__属性 classFoo(object): __metaclass__=something… 如果这么做了,Python就会用元类来创建类Foo,这里面有些技巧。首先写下class Foo(object),但是类Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类 GC垃圾回收 1.GC垃圾回收 ①小整数对象池:Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是[-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收 ②大整数对象池:每一个大整数,均创建一个新的对象 ③intern机制:假如要创建n个对象的是一样的字符串,那么python只会创建一个内存空间来存储,其他对象都是引用,但如果字符串中出现空格或其他符号就表示为不同的对象 2.GC(Garbage collection)垃圾回收 Python里也同Java一样采用了垃圾收集机制,不过不一样的是: Python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略 3.引用计数机制的优点 ①简单 ②实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时 4. 引用计数机制的缺点 ①维护引用计数消耗资源 ②循环引用 5.GC系统所承担的工作远比"垃圾回收"多得多。实际上,它们负责三个重要任务: ①为新生成的对象分配内存 ②识别那些垃圾对象 ③从垃圾对象那回收内存 6.垃圾回收机制:Python中的垃圾回收是以引用计数为主,分代收集为辅 ①导致引用计数+1的情况: 对象被创建,例如a=23 对象被引用,例如b=a 对象被作为参数,传入到一个函数中,例如func(a) 对象作为一个元素,存储在容器中,例如list1=[a,a] ②导致引用计数-1的情况: 对象的别名被显式销毁,例如del a 对象的别名被赋予新的对象,例如a=24 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会) 对象所在的容器被销毁,或从容器中删除对象 7.查看一个对象的引用计数 importsys a="helloworld" sys.getrefcount(a) ①可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1 ②有三种情况会触发垃圾回收: 调用gc.collect() 当gc模块的计数器达到阀值的时候 程序退出的时候 8.gc模块的自动垃圾回收机制: ①必须要import gc模块,并且is_enable()=True才会启动自动垃圾回收。 ②这个机制的主要作用就是发现并处理不可达的垃圾对象。 ③垃圾回收 = 垃圾检查 + 垃圾回收 ④在Python中,采用分代收集的方法。把对象分为三代,一开始,对象在创建的时候,放在一代中,如果在一次一代的垃圾检查中,该对象存活下来,就会被放到二代中,同理在一次二代的垃圾检查中,该对象存活下来,就会被放到三代中 ⑤gc模块里面会有一个长度为3的列表计数器,可以通过gc.get_count()获取,gc.set_threshold(threshold0[, threshold1[, threshold2]) 设置自动执行垃圾回收的频率,例如(700,10,10)每一次计数器的增加,gc模块就会检查增加后的计数是否达到阀值的数目,700表示阈值,10表示没清理10次零代就清理一次二代,第二个10表示每清理10次一代链表就清理二代一次 注意点: gc模块唯一处理不了的是循环引用的类都有__del__方法,所以项目中要避免定义__del__方法 内建属性 常用专有属性 说明 触发方式 __init__ 构造初始化函数 创建实例后,赋值时使用,在__new__后 __new__ 生成实例所需属性 创建实例时 __class__ 实例所在的类 实例.__class__ __str__ 实例字符串表示,可读性 print(类实例),如没实现,使用repr结果 __repr__ 实例字符串表示,准确性 类实例 回车 或者 print(repr(类实例)) __del__ 析构 del删除实例 __dict__ 实例自定义属性 vars(实例.__dict__) __doc__ 类文档,子类不继承 help(类或实例) __getattribute__ 属性访问拦截器 访问实例属性时 __bases__ 类的所有父类构成元素 类名.__bases__ def__getattribute__(self,obj): ifobj=='subject1': print('logsubject1') return'redirectpython' else:#测试时注释掉这2行,将找不到subject2 returnobject.__getattribute__(self,obj) __getattribute__的作用可以用来打印Log日志 __getattribute__的坑: classPerson(object): def__getattribute__(self,obj): print("---test---") ifobj.startswith("a"): return"hahha" else: returnself.test deftest(self): print("heihei") t.Person() t.a#返回hahha t.b#会让程序死掉 #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中if条件不满足,所以程序执行else里面的代码,即returnself.test问题就在这,因为return需要把self.test的值返回,那么首先要获self.test的值,因为self此时就是t这个对象,所以self.test就是t.test此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产生了递归调用,由于这个递归过程中没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序崩溃 #注意:以后不要在__getattribute__方法中调用self.xxxx 调试 1.调试:pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++) 执行时调试 程序启动,停止在第一行等待单步调试 python-mpdbxxx.py 2.调试方法 ①n(next)执行下一步 ②l(list)显示当前执行进度 ③c(continue)继续执行代码 ④b(break)添加断点 ⑤q(quit)中止并退出 ⑥clear num删除指定断点 ⑦p(print)打印变量的值 ⑧a(args)打印所有的形参数据 ⑨s(step)进入到一个函数 r执行代码直到从当前函数返回

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册