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) :这个明显是真,但是测试不通过,这时候我们应该使用assertAlmostEqual() : 判断几乎相等
  4. assertIs(A,B) : 判断两个值的地址值是否相等。也就是是否为同一个引用
  5. assertIsNone(A,B):判断函数或者是方法返回的结果是否为None
  6. assertIsInstance(A,类型) :判断这个字面值或者是变量是不是另外一个类型的实例
  7. assertGreater(A,B) : 判断是否大于

猜你喜欢

转载自blog.csdn.net/crazyhulu/article/details/86653992