Python学习第五天~面向对象2、错误异常处理、函数测试、单元测试

 

面向对象特征:封装,继承,多态

多态指:同一消息不同人给出的反应不同,比如程序员和HR的工作就是不同

,但是他们都是在工作,工作的内容不同

 

__repr__:程序员看简易的对象用的,控制台写对象

 

__str__:让普通用户看的更直白一些,打印

 

__del__:删除对象执行

class Book:
    count = 0
    #初始化对象的时候调用
    def __init__(self,title,price = '0.0',author = None):
        self.title = title
        self.price = price
        self.author = author
        Book.count += 1
 
    #删除对象的时候执行
    def __del__(self):
        Book.count -= 1
        
    #在控制台打印该对象的时候执行
    def __repr__(self):
        return '[图书:{} ,定价:{}]'.format(self.title,self.price)
 
    def print_info(self):
       print( self.title, self.price,self.author)
 
if __name__  == '__main__':
    book = Book('Python经典',price = 29.0,author = 'Tom')
    book2 = Book('Flask')
    book3 = Book('ASP.net')
    #现在删除一本图书
    del(book3)
    print('图书的数量:{}'.format(Book.count))

全局count 可以放在self 外面但是还在Book内

 

def static_method():  静态函数逻辑上与实例无关

 

公司员工情况实例:

import  datetime
class Department:
    def __init__(self,department,phone,manager):
        self.department=department
        self.phone=phone
        self.manager=manager
    def __repr__(self):
        return '部门:{}'.format(self.department)

class Employee:
    def __init__(self,department,name,birthday,salary):
        self.department=department
        self.name=name
        self.birthday=birthday
        self.salary=salary
    @property
    def age(self):
        return  datetime.date.today().year-self.birthday.year

    def give_raise(self,percent,bonus=.0):
        self.salary=self.salary*(1+percent+bonus)   #增加百分比+奖金

    def __repr__(self):
        return '<员工:{}>'.format(self.name)
    def working(self):
        print('员工:{},在工作....'.format(self.name))

class Programer(Employee):
        def __init__(self,department,name,birthday,salary,specialty,project):
            super().__init__(department,name,birthday,salary)
            self.specialty=specialty
            self.project=project
        def working(self):
            print('程序员:{}在开发项目:{}...'.format(self.name,self.project))

if __name__ =='__main__':
    dep = Department('技术部','024-123456','张大大')
    p = Programer(dep,'Peter',datetime.date(1990,3,1,),8000,'Python','CRM')
    print(p.department)
    print(p.salary)
    p.give_raise(.2,.1)
    print(p.salary)
    print(p.department.phone)

@property的就是一个属性,它将下面的函数解析成为一个属性来用, 运用的时候直接像是使用变量就行了

 

错误异常处理

错误类型:

  • 语法错误(SynataxError): 少引号,括号什么的
  • 语意错误(ZeroDivisionError):5/0   0不能作为被除数
  • 逻辑错误: 逻辑错误一般不报,需要自己排查,最复杂的

排除错误的方式-----异常处理:

  • try     except
  • try:后面写的是有可能出现异常的代码
  • except 异常类型 as  实例: 捕获异常
  • else:未招异常时
  • finally:不管有没有异常都会执行
  • raise  : AttributeError(‘属性错误’)手动抛出异常
try:
    x = 5 / 0
    print(x)
except ZeroDivisionError as e:
    print('不能除零',e)
except:
    print('其他异常')
else:
    print('没有异常')
finally:                #中间不管有没有遇到异常,都会执行的
    print('中间不管有没有遇到异常,都会执行的')

异常处理测试

写类

class Coder:
    def __init__(self,name):
        self.name = name
        self.skills=[]

    def mastering_skill(self,skill):
        self.skills.append(skill)

    def show_skill(self):
        print('掌握技能:')
        for skill in self.skills:
            print('-',skill)

c=Coder('Tom')
c.mastering_skill('Python')
c.mastering_skill('C#')
c.show_skill()

测试类

import unittest
from coder import  Coder

class CoderTestCase(unittest.TestCase):
    def test_skill_in(self):
        c=Coder('Tom')
        c.mastering_skill('Python')
        c.mastering_skill('ASP.NET MVC')

        self.assertIn('Python',c.skills)

if __name__=='__main__':
    unittest.main()

函数测试

def get_formatted_name(first,last):
    full_name = '{}   {}'.format(first,last)
    return full_name.title()
 
print(get_formatted_name('tom','lee'))
 

测试类

import unittest
from Day09Study.test import get_formatted_name
 
class NameTstCase(unittest.TestCase):
    def test_title_name(self):                            # 名字已test_下划线开头
        formatted_name = get_formatted_name('tom','lee')
        self.assertEqual(formatted_name,'Tom   Lee')
 
if __name__ == '__main__':
    unittest.main()

判断结果是否相等

单元测试(unittest)

  1. 对代码最基本单元(函数方法)的测试
  2. 给予特定条件判断结果是否符合预期
  3. 相对整个程序的测试,单元测试简化了测试任务
  4. unittest模块

断言测试两值是否相等

#单元测试
import  unittest


def add(a,b):
    return  a+b
class MyTest(unittest.TestCase):
    def test_add(self):
        self.assertEqual(8,add(5,3))


if __name__ == '__main__':
    unittest.main()

代码组织---断言

  1. assertTrue(A in B )  : 断言结果是否为true  : 判断一个变量是否在另外的一个变量中,我们使用的是  in 这个关键字
  2. assertIn(A,B) : 专门来断言判断是否包含,判断A是否在B中
  3. assertEqual(3.3 , 1.1 + 2.2) :这个明显是真,但是测试不通过,这时候我们应该使用,
  4. assertAlmostEqual() : 判断几乎相等
  5. assertIs(A,B) : 判断两个值的地址值是否相等。也就是是否为同一个引用
  6. assertIsNone(A,B):判断函数或者是方法返回的结果是否为None
  7. assertIsInstance(A,类型) :判断这个字面值或者是变量是不是另外一个类型的实例
  8. assertGreater(A,B) : 判断是否大于
import  unittest

# 单元测试 断言方法

person={'name':'Mike','age':20}
numbers=[1,3,2,88,7,44]
s='优品课堂 codeclassroom.com'

class TestAssert(unittest.TestCase):
    def test_assert_method(self):
        #self.assertEqual('Mike',person.get('name'))    相等
        #self.assertTrue('优品课堂'in s)                是否为真
        #self.assertIn('优品课堂', s)                   是否包含
        #self.assertAlmostEqual(3.3,1.1+2.2)            是否约等
        #self.assertIs(True+1,2)                        是否同引用
        #self.assertIsNone(person.get('Name',None))     是否为空
        #self.assertIsInstance(numbers[0],int)          是否为同类型
        #self.assertGreater(7,numbers[0])               是否大于

if __name__=='__main__':
    unittest.main()

 

装置

  • 测试用例类 继承自 unittest.TestCase
  • test 定义功能测试函数名
  • SetUp()函数定义准备初始化代码
  • tearDown() 函数 :清理内存工作

 

#计算器

class Calulator:
    def __init__(self,x,y):
        self.x=x
        self.y=y

    def add(self):
        return  self.x+self.y

    def subtract(self):
        return  self.x-self.y

if __name__ =='__main__':
    c=Calulator(5,3)
    print(c.add())
    print(c.subtract())

测试

import unittest
from calculator import Calulator


class CalculatorTest(unittest.TestCase):

    def setUp(self):          #把c=Calulator(5,3)这个类 放到刚开始准备工作内
        self.c=Calulator(5,3) #Calulator类构造  5,3  ,好处是下面不用再构造c=Calulator(5,3)这个类啦
    def test_add(self):
       # c=Calulator(5,3)
        self.assertEqual(8,self.c.add())
    def test_subtract(self):
       # c=Calulator(5,3)
        self.assertEqual(2,self.c.subtract())

    def tearDown(self):   #关闭连接 语句  测试完事之后 清除内存
        del self.c

if __name__ == '__main__':
    unittest.main()

 

 

你可能感兴趣的:(Python学习第五天~面向对象2、错误异常处理、函数测试、单元测试)