面向对象特征:封装,继承,多态
多态指:同一消息不同人给出的反应不同,比如程序员和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)
- 对代码最基本单元(函数方法)的测试
- 给予特定条件判断结果是否符合预期
- 相对整个程序的测试,单元测试简化了测试任务
- 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()
代码组织---断言
- assertTrue(A in B ) : 断言结果是否为true : 判断一个变量是否在另外的一个变量中,我们使用的是 in 这个关键字
- assertIn(A,B) : 专门来断言判断是否包含,判断A是否在B中
- assertEqual(3.3 , 1.1 + 2.2) :这个明显是真,但是测试不通过,这时候我们应该使用assertAlmostEqual() : 判断几乎相等
- assertIs(A,B) : 判断两个值的地址值是否相等。也就是是否为同一个引用
- assertIsNone(A,B):判断函数或者是方法返回的结果是否为None
- assertIsInstance(A,类型) :判断这个字面值或者是变量是不是另外一个类型的实例
- assertGreater(A,B) : 判断是否大于