<1>创建类
class NameOfClass:............1
def init(self):............2
def ways(self):............3
1行前者是关键字表示类,后者采用pascal命名法(单词首字母大写)
普通变量时下划线命名法(只能含有数字,字母和下划线,变量名不能以数字下划线开头)
2行表示构造函数,注意有两个下划线,self表示对象自身,可以将属性值绑定在实例对象上
如self.name="Tom",如果写成name="Tom",python会识别为给普通的name变量赋值,不会将这个值看做是对象的属性
3行表示定义类的方法,self的作用是在方法里面去获取或修改和对象绑定的属性
python
class Student:
def __init__(self,name,student_id):
self.name=name
self.student_id=student_id
self.grades={"语文":0,"数学":0,"英语":0}
def set_grade(self,course,grade):
if course in self.grades:
self.grades[course]=grade
def print_grades(self):
print(f"学生{self.name},学号:{self.student_id}的成绩为:")
for course in self.grades:
print(f"{course}:{self.grades[course]}分")
s1=Student("a","001")
print(s1.name)
s2=Student("b","002")
s2.set_grades("数学",100)
print(s2.grades)
s2.print_grades()
<2>类继承
python
class Mammal:
def __init__(self,name,sex):
self.name=name
self.sex=sex
self.num_eyes=2
def breathe(self):
print(self.name+"在呼吸......")
def poop(self):
print(self.name+"在拉屎......")
class Human(Mammal):
def __init__(self,name,sex):
super().__init__(name,sex)
self.has_tail=False
def read(self):
print(self.name+"在阅读......")
class Cat(Mammal):
def __init__(self,name,sex):
super().__init__(name,sex)
self.has_tail=True
def scratch_sofa(self):
print(self.name+"在抓沙发......")
其中Human是子类,Mammal是父类,在调用方法时,优先看自己有没有,如果有用自己的,如果没有往上找父类的同名方法
python
class Employee:
def __init__(self,name,id)
self.name=name
self.id=id
def print_info(self)
print(f"员工姓名:{self.name},员工id:{self.id}")
class FullTimeEmployee(Employ):
def __init__(self,name,id,monthly_salary)
super().__init__(name,id)
self.monthly_salary=monthly_salary
def fcalculate(self)
return self.monthly_salary
class PartTimeEmployee(Employ):
def __init__(self,name,id,daily_salary,work_days)
super().__init__(name,id)
self.daily_salary=daily_salary
self.work_days=work_days
def pcalculate(self)
return self.daily_salary*self.work_days
zs=FullTimeEmployee("zs","1001",3000)
ls=PartTimeEmployee("ls","1002",50,18)
zs.print_inf0()
ls.print_inf0()
print(zs.fcalculate())
print(ls.pcalculate())
<3>文件操作
f=open(".\data.txt","r",encoding="utf-8")......1
print(f.read())......2
print(f.read(10))......3
print(f.readline())......4
print(f.readlines())......5
f.close()......6
with open(".\data.txt") as f:......7
print(f.read())
1.打开文件读 open("文件的相对路径或者绝对路径","r"),如下想要打开文件写的话,把r改成w(如果文件不存在会帮你创建,如果文件原本有内容,执行写操作后会将原本内容清空,如果不想清空原来的内容,就将w换成a,a为附加模式。或者写成r+w,支持读写功能,并且是追加内容),不写时默认为读取,encording为文件的编码方式
2.当执行完一次print(f.read())后,会打印出文本的所有内容。但是如果执行两次print(f.read()),第二次会读取空字符串并打印,因为文件会记录之前读取到的位置
3.会读取第1-10个字节的文件内容
4.会读取一行文件内容并打印
5.readlines会读取全部文件内容,并把每行作为列表元素返回
6.关闭文件,释放资源
7.在缩进块内的内容执行完后,文件会自动关闭
<4>异常类型
(1)常见的错误类型
1.IndexError 索引错误,产生了长度范围之外的索引
2.ZeroDivisionError 除零错误
3.FileNotFoundError 找不到文件错误,文件不存在
4.TypeError 类型错误,如让两个字符串做乘法
5.IndentationError 缩进错误
6.ImportError 导入模块错误
7.ArithmeticError 计算错误
8.SyntaxError 语法错误
9.ValueError 值错误
10.KeyError 键错误
11.AttributeError 属性错误
(2)捕捉异常
try: 有可能产生错误代码
......
except: 产生其他错误时会运行
......
else: 没有错误会运行
......
finally: 无论错误与否都会执行
......
<5>测试
unittest是一个常用的单元测试的测试库(Python自带)
测试在my_calculator.py文件中的my_adder函数
python
def my_adder(x,y):
return x+y
测试用例
python
import unittest
from my_calculator import my_adder
class TestMyadder(unittest.TestCase):
def test_positive_with_positive(self): #函数名必须以text_开头
self.assertEqual(my_adder(5,3),8)
def test_negative_with_positive(self):
self.assertEqual(my_adder(-5,-3),-2)
写好测试用例后在编辑器终端输入python -m unittest表示运行unittest这个库,这个库会自动搜索所有继承了unittest库里TestCase类的子类,运行他们所有以test_开头的方法,然后展示测试结果
unittest.TestCase类的常见测试方法
|---------------------|-------------------|
| 方法 | 类似于 |
| assertEqual(A,B) | assert A==B |
| assertTrue(A) | assert A is True |
| assertIn(A,B) | assert A in B |
| assertNotEqual(A,B) | assert A!=B |
| assertFalse(A) | assert A is False |
| assertNotIn(A,B) | assert A not in B |
<6>高阶函数和匿名函数
函数是可以传入函数的,直接传入函数名即可无需传入参数,这样的函数成为高阶函数
calculate(add)
也可以传入匿名函数
calculate(lambda a,b:a+b),冒号前面是传入匿名函数的参数,冒号后面是要返回的结果
匿名函数可以定义好后被直接调用
(lambda a,b:a+b)(2,3)