3.2 当有两次继承时,演示super指向他紧邻的父类 我们把上面的例子扩展成两次继承, 就看出:马克-to-win,Super是一个参考(或说指针)指向他紧邻的父类,而不是最底层的基类。
由于先前 PySide 项目不是很完善,并且缺乏文档,所以存在感并不是很高,网上有关使用 Python 编写 Qt 的资料几乎都是 PyQt 占大多数。...PyQt5 的自定义信号类名为 pyqtSignal,而 PySide2 的类名为 Signal。 PyQt5 的槽函数装饰器名称为 pyqtSlot,而 PySide2 的装饰器名称为 Slot。...这是主界面类:main_window.py # 导入可能用到的标准库模块 import # 导入 PySide2 库模块 from PySide2.QtWidgets import QWidget...2.1 控件的信号连接 对于控件的某些事件所发送的信号,例如按钮的 clicked 信号,则可以直接通过 connect 方法连接到槽函数中。...,子线程类中多了信号的定义以及信号的发射;而在主线程中定义了一个用于打印时间信息的槽函数,并在实例化子线程后,直接将子线程的信号连接到主线程的槽函数中。
我们都知道GUI界面设计不是python的强项,但作为万金油编程语言,python也并不是不支持GUI开发。 ?...界面框架设计,python当前有3种实现方式,分别是Tkinter、wxWidgets、PyQt5或Pyside2,三种方式各有利弊,但从直观便捷的角度看,PyQt5或Pyside2更具优势。...这二者较为相似,本次设计中选用Pyside2。...几个控件,在Pyside2的Designer模式,直接设计控件及布局,主要是选用了comBox作为实现平台、常用城市列表的下拉框实现,用lineEdit实现关键词的输入,用pushButton实现查询和清空的按钮功能...定义了一个助手类,初始化函数中首先通过pyside2库关联QT designer界面,并重点实现了“一键查询”功能。
前言 很多时候我们的程序运行结果都是一个黑黑的终端窗口,对于使用者来说并不是很友好,正如windows操作系统会有那么多人使用一样,用鼠标点点就可以了,如果是Linux那种命令行操作的话,那我相信很多人都不会愿意去使用...在python中,它的名字不叫Qt,而是叫做PySide2,但是功能是一样的,当然还有其它公司开发的PyQt5,功能也是一样的。...至于为什么会有这么多不同名字和版本,感兴趣的可以自己去了解,我们这里要使用的是PySide2,它是Qt5在python中的版本。...安装模块 在使用前,我们需要先安装pyside2模块,这里有两种方法,直接使用pip install PySide2安装,第二种使用国内的镜像安装,速度会比较快。 ?...PySide2程序基本结构 通过上面的程序,我们可以自己简单的总结一下,pyside2程序的基本结构: 1.导入要用的库和控件。2.创建程序管理器。3.要使用的控件和实现的功能。
PyQt和PySide2这两者最大的区别就是协议的不同,来自于不同的开发商,但其实这两个如果要修改并兼容的话,改动并不是很大,具体的可以参照Qt官方文档介绍 虽然PyQt发布的早,并且稳定,资料也比较多...,而PySide起步比较晚,直到2018年6月正式发布了PySide2的第一个版本,从0到1是最难的一步,后面就容易了,尤其发布的Qt 5.12 LTS释放了非常积极的信号,PySide2已经日趋完善,...又是亲生的,还有LGPL开源协议的加持,今后PySide2有足够的理由成为Python开发者使用Qt的第一选择。...__属于module的属性,它是一个全局变量 在Python中一切都是对象,全局变量则是module的属性,类变量则的类的属性,实例变量则是对象的属性,局部变量就可以认为是函数或方法的属性嘛 OptionMenu...在Python中一切都是对象,全局变量则是module的属性,类变量则的类的属性,实例变量则是对象的属性,局部变量就可以认为是函数或方法的属性嘛
如果不属于,则直接调用指针或引用的静态类型对应的函数,如果此函数不存在,则编译出错。...,因为在基类并没有定义Draw(int) 的虚函数,于是查找基类是否定义了Draw(int),还是没有,就出错了,从出错提示也可以看出来:“IRectangle::Draw”: 函数不接受 1 个参数。...如果没有这样做的话,只会输出基类的 析构函数,这种输出情况通过比对规则2也可以理解,pI 现在虽然指向派生类对象首地址,但执行pI->~IRectangle() 时 发现不是虚函数,故直接调用, 假如在派生类析构函数内有释放内存资源的操作...因为此时基类是空类1个字节,派生类有虚函数故有vptr 4个字节,基类“继承”的1个字节附在vptr下面,现在的p 实际上是指向了附属1字节,即operator delete(void*) 传递的指针值已经不是...= sizeD,参照规则4,pb[1] 按照B的大小去跨越,指向的根本不是一个真正的B对象,当然也不是一个D对象,因为找到的D[1] 虚函数表位置是错的,故调用析构函数出错。
上期笔记续集 在上一篇探索笔记 《结合 Qt 信号槽机制的 Python 自定义线程类》 中,我初步研究了一下 Python3 的 threading.Thread 类以及 PySide2 的信号槽机制...它从哪里来的?它是干嘛的? QThread 其实是 Qt 的一个专门用于处理多线程的类。在 Python 语言中,QThread 可以来自于 PyQt5,也可以来自于 PySide2。...我特意去对比了一下,PyQt5 的 QThread 比 PySide2 的足足多了13个方法,真的是扶不起的 PySide2 啊~~不过即使 PySide2 如此不争气,我也还是喜欢它,没别的理由,喜欢就是喜欢...哇,好多方法名称,是不是看得头昏眼花?...Qt 自带的 QThread 类为我们提供了许多非常的接口,但其实它也不是完全安全可靠的,一切可靠性的程序都应该由程序员自主判断和设计,针对不同的需求,应该根据实际情况选择最优的解决方案,而不是一味追求通用而忽略了用户体验或数据安全
继承 指一个派生的类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对待。 实例化 创建一个类的实例,一个类的具体对象。 方法 类中定义的函数。 对象 通过类定义的数据结构实例。...类变量和实例变量 类变量不需要实例化直接使用,相当于绑定在类上,不是实例化上。...我们写入import Pyside2 ,然后会出现Pyside2 底部红线,旁边有个小红灯泡,我们直接点击红灯泡然后会提示出下面提示,我们直接选择install package Pyside2 就会自动的安装...一般这几个可执行文件在我们安装好pyside2包之后就可以找得到的,你可以直接在全局文件夹中搜索。...,看下变化是不是少了我们当前连接的这个串口,这样我们就可以确定我们当前连接的串口是否被拔出,如果被拔出,可以直接弹出弹框提示,如不不是当前连接的串口可以不做处理都行的。
异常的类型 在python标准中,定义了一些标准的异常类型,这些类型可以直接使用。...异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类...所有的内建标准异常的基类 ArithmeticError 所有数值计算错误的基类 FloatingPointError 浮点计算错误 OverflowError 数值运算超出最大限制 ZeroDivisionError...IndexError 序列中没有没有此索引(index) KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命的) NameError 未声明/初始化对象...解码时的错误 UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning
将 HTML 网页转换为 PDF 是很多人常见的一个需求,在浏览器上,我们可以通过浏览器的“打印”功能直接将网页打印输出为 PDF。 但是如果有多个网页就不好办了。...州的先生至今没有在 Windows 电脑上安装成功过! 浏览器方案 在上述两种方案中,二进制程序的可控制性稍有不足,而纯 Python 实现的渲染解析则在功能上和依赖上不是有友好。...借助于 Qt 的 Python 实现(PyQt5 系列 和 PySide2 系列),我们可以直接调用 Qt 中的 Web 引擎相关的接口。...其中 QtWebEngineWidgets 子模块中的 QWebEngineView() 类提供了 printToPdf 方法供我们将网页打印为 PDF 文档,所以基于此,我们也可以使用 PyQt5 或...PySide2 进行 HTML 转换 PDF,示例如下所示: ?
BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。...# 关于模块导入时可能出错的警告的基类 +-- UnicodeWarning # 与Unicode相关的警告的基类 +-- BytesWarning...# 与bytes和bytearray相关的警告的基类 +-- ResourceWarning # 与资源使用相关的警告的基类。...,异常应该是通过直接或间接的方式继承自Exception类。...下面创建了一个MyError类,基类为Exception,用于在异常触发时输出更多的信息。
python2.7版本安装 conda create --name=labelme python=2.7 source activate labelme # conda install -c conda-forge pyside2...分割任务标注示例 终端直接输入: # 直接打开labelme labelme open:打开某一张图片 openDir:打开某一文件夹,加载其目录下的所有图片 通过 open 读取图片,选择 create...其他说明 (1)启动 labelme 的方式: # 直接打开labelme labelme # 打开某个文件夹,加载该文件夹下及其子文件夹下的所有图片 labelme path/to/imgfile/...# 直接打开指定的图片 labelme cat.1.jpg # 标注保存为json文件同时自动关闭gui窗口 labelme cat.1.jpg -O cat.1.jpg.json # 指定label...加载标签png label.png 用 scipy.misc.imread 或者 skimage.io.imread 读取可能会出错,推荐用 PIL.Image.open 读取: >>> import
BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。...) | ±- KeyError # 映射中没有这个键 ±- MemoryError # 内存溢出错误(对于Python 解释器不是致命的) ±- NameError # 未声明/初始化对象 (没有属性)...# 有关可疑的运行时行为的警告的基类 ±- SyntaxWarning # 关于可疑语法警告的基类 ±- UserWarning # 用户代码生成警告的基类 ±- FutureWarning # 有关已弃用功能的警告的基类...±- ImportWarning # 关于模块导入时可能出错的警告的基类 ±- UnicodeWarning # 与Unicode相关的警告的基类 ±- BytesWarning # 与bytes和bytearray...用户自定义异常 你也可以通过创建一个新的异常类拥有自己的异常,异常应该是通过直接或间接的方式继承自Exception类。
第一种方法,对于类的数目很少的情况还可以,如果类的数目比较多,全部理解源代码,然后重写就很耗时间,而且很容易出错,更甚者,如果遇到大的项目想全部理解源代码几乎是不可能的。...hpijs程序中类有140多个,这个时候就需要采用第二个方法了,你可以一个类一个类的改没有什么太高的难度,如果不是笔误的话,几乎不会出错,而且根本不需要理解程序逻辑,也许改完后你对程序所要实现的功能还一无所知...1)对于类的数据成员可以直接转为C中结构体的数据成员。 2)函数则需转化为对应的函数指针,因为struct里不允许出现函数的声明和定义。...实例化类时作参数。 这三种情况下都是由系统直接调用类的拷贝构造函数而不是构造函数。 注意:C=D;不会调用拷贝构造函数,这种情况下使用的是重载‘=’运算符的方法。...这是为了保持类的继承带来的动态联编的特性。 类之间的继承关系是复杂且多变的,为了保证基类在所有子类中的唯一而且方便修改,最好的方法就是把基类的结构体部分做成宏,在子类中直接使用即可。
BaseException 所有异常的基类 | | +-- SystemExit 解释器请求退出 |...| | +-- Exception 常规错误的基类,异常都是从基类Exception继承的。...关于模块进口可能出现错误的警告的基类。...+-- UnicodeWarning 有关Unicode警告的基类。...+-- BytesWarning 有关字节警告相关的基类。
当这样的一个指向派生类的基类指针析构时,如果析构函数不是虚函数,则直接调用基类的析构函数,那么派生类获取的资源未释放,则会造成内存泄漏。...不过这种操作只有在基类是多态用途时才需要注意,也有很多类不是为了多态的用途,例如STL容器和上文的Uncopyable。...对于派生类的构造函数而言,进入其中时基类部分已构造完而派生类部分未构造完,对象类型是基类,故而此时调用虚函数,实际上使用的是基类的虚函数。 析构函数同理。...进入析构函数后派生类部分呈未定义值,对象类型是基类,调用的是基类的虚函数。 总而言之,在构造函数与析构函数中虚函数的行为有特殊变化;为了避免出错,不要在其过程中使用虚函数。...因此,必须仔细地复制所有派生类成员,并调用基类的拷贝操作来复制基类成员。
继承的另一个例子 下面试试科比: kobe没有x属性,因为在Kobe类中,重写了魔法方法init_(),但是没有初始化科比的x坐标和y坐标,因此调用move()会出错。...解决方法:在kobe类中重写__init()方法的时候先调用基类Ball()的init方法。...kobe也可以成功运行: 这里需要注意的是,这个self并不是父类Ball的实例对象,而是子类Kobe的实例对象,所以说未绑定指并不需要绑定父类的实例对象,使用子类的实例对象代替即可。...不理解也没关系,因为,super函数可以代替它 super 运行之后得到: super函数的神奇之处在于,你不需要给出任何基类的具体名字,它会自动找到所有基类以及对应的方法。...多重继承 组合 把不同的类直接放进去实例化,就叫组合: 运行 组合.py得到: 类、类对象和实例对象 实例对象会把类对象进行赋值覆盖。
继承注意点 4.1 构造函数 派生类的构造函数,需要保证调用基类的构造【默认调用基类无参构造,如果基类创新提供了新的有参构造,则派生类的构造易出错】,见3.3 牛牛的书 解决办法:最好每次提供新的构造函数时都再提供一个无参的默认构造函数...4.1.1 构造函数的形参 构造函数的参数最好不要和class 的数据同名,否则需要加上this,不然出错!...派生类的构造函数调用前需要调用基类的构造函数,并且派生类新增数据需要加this,否则出错。...int z; public: //构造函数 Sub(int a, int b, int c) :Base(a, b) {//继承基类的构造...Sub sub(x, y, z); cout << sub.calculate() << endl; return 0; } 4.2 纯虚函数 纯虚函数: 纯虚函数本身在基类中没有具体的实现
1.2 构造函数的继承与覆盖 一个类只初始化其直接基类,出于同样的原因,一个类也只继承其直接基类的构造函数。...派生类继承直接基类的构造函数的方法是使用 using 声明语句,如下: class Base { public: Base() {}; // 1....这种方式是必需的,否则编译器会试图调用基类默认构造函数,而基类并无默认构造函数,编译会出错; 在派生类构造函数中,使用 ::Base() 形式显示调用基类构造函数。...程序输出如下:(//后不是打印内容,是说明语句) FishDummyMember constructor // 基类数据成员实例化 FishPrivateMember constructor...,而不是复制整个对象。
领取专属 10元无门槛券
手把手带您无忧上云