2、python框架Unitter轻量级框架

news2024/10/9 2:22:08

类与对象定义

                       面向过程与面向对象
面向过程编程:
      根据操作数据的函数或语句块来设计程序的。
面向对象编程:
数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法;
在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Python既可以提供面向过程的编程,也可以面向对象的编程,归根到底,Python语言是面向对象的编程语言。

类与对象示例

 class Bird():
       def __init__(self):
    self.hungry = True
       def eat(self):
    if self.hungry:
        print('Aaaah...')
        self.hungry = False
    else:
        print('No,thanks!')

>>> b1=Bird()
>>> b1.eat ()
Aaaah...
>>> b1.eat ()
No,thanks!
>>> b1.eat ()
No,thanks!
>>> b1.hungry
False
>>> b1.hungry
False

类和对象是面向对象编程的两个主要方面,类创建一个新类型,而对象是这个类的实例 。这类似于上面一个类Bird(),而b1是类Bird的一个实例,也就是类的一个对象(实例)。

类的组成元素:
 关键字(类): class
 类的名字:    Bird
 构造函数:    __init__(self)
 类的方法:    eat(self)  (b1.eat())
 类的特性:    hungry     (b1.hungry)

 class Class_Name(SuperClass,…):
         class_variable = value
         def  __init__(self, argv):
                    statement
         def  class_func(self, argv): 
                    statement

 关键字(类):class
 类的名字: Class_name
 构造函数: __init__(self,argv)
 类的方法: class_func(self, argv)
 类的特性: class_variable      

  class_object_1 = Class_Name()
  class_object_2 = Class_Name()
  class_object_1.class_variable
  class_object_2.class_variable
  class_object_1.class_func(argv)
  class_object_2.class_func(argv)

 对象定义: class_object_1 = Class_Name()
 对象特性: class_object_1.class_variable
 对象方法: class_object_1.class_func(argv)

 类与对象特性

                                类与对象特性
对象可以使用普通的属于对象的变量存储数据,属于一个对象或类的变量被称为特性;对象也可以使用属于类的函数具有的功能;这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来;特性和方法可以合称为类的属性。
特性有两种类型:属于每个实例/类的对象或者属于类本身,它们分别被称为实例变量和类变量。
类使用class关键字创建,类的特性和方法被列在一个缩进块中。

与类和对象的名称空间绑定的普通变量,即这些名称只在这些类与对象的前提下有效。
类名.类变量(使用对象名.类变量也可访问);
对象名.对象变量。
命名空间定义的位置:
类特性:紧跟在类定义之后;
对象特性:在__init__中使用self.xxx=定义。
        例子:

      class var():
             value = 1
 >>> instance1=var()
 >>>var.value
 >>>instance1.value

类与对象方法        

类的方法与普通的函数只有一个特别的区别:类的方法必须有一个额外的第一个参数名称self,但是在调用这个方法的时候你不必为这个参数赋值,Python会提供这个值,这个特别的变量指的是对象本身,按照惯例它的名称就是在类定义中常见的 self 这个变量名。
可以是任意一个变量名,但最好遵循通用的规则;
Self 这个变量名具有一定的魔法,在具体的对象中它有特定的意义。

Self参数的工作原理:假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method (MyObject, arg1, arg2),这就是 self 的使用原理。
如果你有一个不需要参数的方法,你还是得给这个方法定义一个带有 self 参数。
类与对象方法的使用:调用方法同普通函数一致,忽略self参数。
对象名.方法名(参数…)

 class Bird:
	def __init__(self):
		self.hungry = True
	def eat(self):
		if self.hungry:
			print('Aaaah...')
			self.hungry = False
		else:
			print('No,thanks!')

>>> b=Bird()
>>> b.hungry
True
>>> b.eat()
Aaaah...
>>> b.eat()
No,thanks!
>>> b.eat()
No,thanks!

类与对象:(
__init__构造函数;
__del__析构函数;
__len__,__getitem__,__setitem__, __delitem__这是系列映射规则;……
__privatename 私有类的变量名;
@decorators 装饰器;
__iter__迭代器;
……

类与对象多态

Polymorphism:术语多态来自于希腊语,多态意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而且它也能根据(或者类)对象的类型的不同而表现出不同的行为。

  class var():
         value = 1
 >>>instamce1=var()
 >>>var.value =‘Python ’
 >>>instance1.value =55


  def add1(x,y):
         return x+y
 >>>x=1,y=23
 >>>x=“spam”,y=‘Python ’ 
 >>>add1(x,y)

类与对象封装

Encapsulation:封装是对外部隐藏对象内部细节的原则,看起来有点象多态,但封装并不等于多态;多态可以让用户对于不知道是什么类或者对象类型的对象进行方法调用;而封装是可以不用关心对象是如何构建的而直接进行使用。

  class var():
         value = 1
 >>> instance1=var()
 >>> instance2=var()
 >>> instance1.value=‘Python ’
 >>> instance2.value=55

 

类与对象继承

Inheritance:以普通类为基础建立专门的类对象;如果已经有一个基类,想再建立一个新类,新类中要添加几种新方法,而又要用原来基类的一些方法,这个时候新类就要继承基类的方法,而又有新的方法,这就是继承;继承的方法就是在新类定义中添加一个基类作为参数。

 class SongBird(Bird):
	def __init__(self):
		self.sound = ‘Squawk’
	def sing(self):
		print(self.sound)

类的构造函数

类的构造函数的形式为:

 def  __init__(self):
     superclass.__init__(self)            #未绑定超类
     super(subclass, self).__init__( ) #调用super( )    
     statement

类的构造函数与其它普通方法不同的地方在于,当一个对象被创建后,会立即调用构造方法,就有点类似于程序中的 init 的初始化方法。
如果要继承构造方法,可以调用未绑定的超类构造方法,也可以用super函数调用超类构造函数。

类的构造函数继承

 class Bird:
	def __init__(self):
		self.hungry = True
	def eat(self):
		if self.hungry:
			print('Aaaah...')
			self.hungry = False
		else:
			print('No,thanks!')



 class SongBird(Bird):
	def __init__(self):
		super(SongBird, self).__init__( )
                       self.sound = ‘Squawk’
	def sing(self):
		print(self.sound)

unittest的简单介绍及使用

TestCase:

一个测试用例,或是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run)以及测试后环境的还原(tearDown)。
元测试(unittest)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

TestSuite:

而多个测试用例TestCase集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

TestLoader:

用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

TextTestRunner:

是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

Test Fixture:

对一个测试用例环境的搭建和销毁,通过覆盖TestCase的setUp()和tearDown()方法来实现。
这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp()中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的TestCase留下一个干净的环境。
整个流程:首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,
运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

一个完整的测试脚本包含:

1.import unittest
2.定义一个继承自unittest.TestCase的测试用例类
3.定义setUp和tearDown,在每个测试用例前后做一些辅助工作。
4.定义测试用例,名字以test开头。
5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

6.调用unittest.main()启动测试

7.如果测试未通过,会输出相应的错误提示。如果测试全部通过则不显示任何东西,也可以添加-v参数显示详细信息。

介绍以下unittest的基本用法。
第1种用法(以下代码是官方文档的sample)。
import unittest
class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = range(10)
    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)
    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)
     def setDown(self):
             pass
if __name__ == '__main__':
    unittest.main()
1.从unittest.TestCase继承一个子类。
 2.定义测试方法,以test开头。
 3.调用unittest.main(),这个方法会自动执行所有以test开头的测试方法。

第2种调用方法:自己创建一个TestSuite,添加需要执行测试的TestCase,然后使用TestRunner().run(suite)执行测试。

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(TestSequenceFunctions('test_choice')
    suite.addTest(TestSequenceFunctions('test_sample')
    unittest.TextTestRunner().run(suite)

测试主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。
常见的断言方法有:

方法Checkse备注
 
assertEqual(a,b)a==bp测试的二个值是相等,如果不相等,测试失败
assertNotEqual(a,b)a!=be测试的二个值不相等,如果比较结果相等,测试失败
assertTure(x)Bool(x) is Truer期望的结果是Truee
assertFalse(x)Bool(x) is Falser期望的结果是 Falser
assertls(a,b)a is be
assertlsNot(a,b)a is not be
assertln(a,b)a in be
assertNotin(a,b)a not in be
Fail()无条件的失败。

拓展-测试报告的生成

#导入测试报告生成的模块
import HTMLTestRunner
suite = unittest.TestSuite()
# 定义生成测试报告的名称 filename1=r". result\" + str(time.strftime('%Y%m%d%H%M%S')) + ".html" fp = file(filename1,'wb')
# 定义测试报告的路径,标题,描述等内容 runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自动化测试报告',description=u'自动化测试报告')
#执行测试脚本,并生成测试报告 runner.run(suite)

报告的内容:

 拓展-数据驱动(文本、表格等)

文本: 例子:  作用是获取data_file文本中内容,存放在列表中,作为输入。     

data_file的内容:
姓名    性别     年龄
张三    男         20    
李四    男         24    
……
 
             

def datatouch(i):     source = open ("./data_file.txt", "r")     values = source.readlines()     word=values[i].split() return word

Data_1= datatouch(1)
Test_value1= str(Data_1[0])

数据驱动:从某个数据文件(例如文本、 Excel 文件、CSV 文件、数据库等)中读取输入、输出的测试数据,然后通过变量传入事先录制好的或手工编写的测试脚本中。

常用操作:

导入模块
import xlrd

打开Excel文件读取数据
data=xlrd.open_workbook('excelFile.xls')

获取一个工作表
table = data.sheets()[0]          #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u'Sheet1')#通过名称

获取整行和整列的值(数组)
table.row_values(i)
table.col_values(i)
获取行数和列数
nrows = table.nrows
ncols = table.ncols
获取单元格
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(2,3).value

例子:
import xlrd
data =xlrd.open_workbook('companylist.xlsx')
table = data.sheets()[0]
table_value1= str(table.cell(1,0).value)

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hudi系列11:Flink CDC 将MySQL的数据写入Hudi

文章目录一. 下载依赖包二. 源端数据准备三. 使用Flink cdc mysql连接器创建flinkSQL映射表四. 创建FlinkSQL Hudi连接器创建hudi表五. 将数据从CDC表插入hudi表六. 测试增删改参考:一. 下载依赖包 将 flink-sql-connector-mysql-cdc-2.2.1.jar 下载后,上传到$FLIN…

动手深度学习-欠拟合和过拟合

目录训练误差和泛化误差K-折交叉验证欠拟合和过拟合模型复杂性数据集大小权重衰减权重衰减简洁实现暂退法(Dropout)从零开始实现Dropout简洁实现参考教程:https://courses.d2l.ai/zh-v2/ 训练误差和泛化误差 训练误差(training …

5000字带你了解机房搬迁有哪些步骤?干货收藏!

机房搬迁不仅仅是把机房的设备迁移到新机房那么简单,而是要求网络系统的迁移和集中存储系统的迁移必须安全平稳,不能过长时间影响生产应用。表面上就是几个IT 民工的搬运,但实际是一项目高度集中的体力与脑力的综合项目。现将一般机房搬迁步骤…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Go语言进阶和依赖管理(二)——并发和依赖管理

文章目录一、本文重点内容:二、详细知识点介绍:1、并发和并行并发:并行:结论:2、Go的协程协程:线程:3、协程通信方式一:使用通道交换数据方式二:使用共享内存完成数据交换…

SpringBoot 与 SpringCloud 有什么区别?

🏆今日学习目标: 🍀SpringBoot 与 SpringCloud 有什么区别? ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区&am…

深拷贝,浅拷贝,引用拷贝有什么区别?

目录 引用拷贝 浅拷贝 深拷贝 深拷贝,浅拷贝,引用拷贝有什么区别? 引用拷贝 当我们向复制一个对象的时候,自然想到的就是赋值,直接赋值给另外一个变量,这种做法只是赋值了对象的地址,即两个变量现在指向的是同一个对象,任意一个对象操作这个属性都会影响到另外一个变量,这…

成为一名网络安全工程师,你应该学习什么?

前言 这是我的建议如何成为网络安全工程师,你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程,我建议首先学python,然后是java。 (非必须)接下来学习一些算法和数据结构是很有帮助的,它将帮…

jQuery select三级联动

功能描述: 1 实现三级联动,ajax请求数据。 根据选定级别,查询该级别下的项目类别;根据选择类别,查询该级别类别下所属项目列表; 前端涉及知识点: (1)(‘#app’).change…

【云原生kubernetes】k8s控制器Deployment使用详解

前言 在上一篇我们聊了k8s中各种控制器的使用,本篇将以控制器中比较常用的一种控制器Deployment 进行详细的说明。 一、Deployment 简介 为了更好解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器; 需要说明…

47 转置卷积【动手学深度学习v2】】

47 转置卷积【动手学深度学习v2】】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV17o4y1X7Jn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source75dce036dc8244310435eaf03de4e330 转置卷积 卷积不会增大输入的高…

【Python小游戏】99%的人都不知道,“猜数字”游戏这么玩才能快速胜出,少年,要不要来猜猜看啊~(附源码)

前言 日子从不亏欠,每一个努力向上的人, 未来的走运, 都是过往尽力的积累。 人勤春来早,奋进正当时。新春伊始,我们迎来了2023年开工第一天。 栗子同学恭祝大家开工大吉,新年新气象,万事开门红&#xff…

Spring事务案例:模拟银行转账

Spring事务案例:模拟银行转账一. 概念二. 原程序2.1 表:2.2 service层接口:2.3 dao层接口:2.4 service实现类:2.5 测试用例:三.使用事务改进3.1 开启注解式事务驱动:3.2 开启事务:3.…

python使用pptx库-从一个ppt复制页面到另一个ppt里面

python使用pptx库-从一个ppt复制页面到另一个ppt里面 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、原理 如题,我有一个模板课件.pptx: 其内容&#xf…

百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析

前言 百趣代谢组学文献分享,我国受盐碱化危害耕地面积超过1.4亿亩,严重危险粮食安全和三农问题的解决。因此开发耐盐农作物并研究其耐盐机制具有迫在眉睫的重要意义。 代谢组学文献分享,浙江大学吴德志教授研究组最近发表的研究成果比较了耐…

Jmeter之界面语言设置

一、临时性设置中文 临时性设置:设置后只对本次使用有效,重启Jmeter后恢复默认语言。 选择Options—>Choose Language—>选择其他语言(例如:Chinese(Simplified)简体中文)设置成功。重启…

32 基变换和图像压缩

一、知识概要 本节主题是线性变换与矩阵的关联,从图像压缩与信号处理的应用引入,介绍几种方便的基向量:傅里叶,小波。最后从代数角度大体上介绍了基变换与变换矩阵的关系。 二、图像处理 首先我们假设有一个 512 * 512 的黑白图…

StarRocks斩获「2022 掘金引力榜」年度技术品牌传播案例 Top 10!

近日,由稀土掘金技术社区打造的「掘金引力榜」正式公布,由StarRocks社区举办的StarRocks Summit Asia 2022荣获「掘金引力榜 2022 年度技术品牌传播案例 Top10」!掘金是面向全球中文开发者的技术社区。「掘金引力榜」是由稀土掘金技术社区打造…

【MyBatis持久层框架】配置文件实现增删改查实战案例(下)

前言 前面我们学习了 MyBatis 持久层框架的原生开发方式和 Mapper 代理开发两种方式,解决了使用 JDBC 基础性代码操作数据库时存在的硬编码和操作繁琐的问题。 在配置文件实现增删改查上篇中,我们详细讲解了常用的查询操作,例如查询所有数据…

Spring Boot 项目 - API 文档搜索引擎

在线体验 : http://43.139.1.94:9090/index.html项目 Gitee 链接 : API 文档搜索引擎1.认识搜索引擎我们平时查百度, 搜狗的时候, 结果页会显示若干条相关结果 , 每个结果几乎都包含图片, 标题, 描述, 展示 URL以及时间等等.1.1 搜索引擎的本质输入一个查询词, 得到若干个结果,…