目录
一、继承
故事继续:大猫掌握了 师傅的配方 和 学校的配方,通过研究,大猫在两个配方的基础上,创建了一种全新的煎饼果子配方,称之为 "猫氏煎饼果子配方"。(子类重写父类同名属性和方法)
子类重写父类同名属性的方法
故事继续:大猫的新配方大受欢迎,但是有些顾客希望也能吃到古法配方和 现代配方 的煎饼果子...(子类调用父类的同名属性和方法)
子类调用父类同名属性
故事继续:大猫的煎饼果子店非常红火,终于有一天,他成了世界首富!!
但是他也老了,所以他希望把 师傅的配方 和 学校的配方 以及自己的配方 继续传承下去...(多层继承)
二、私有属性私有方法
公有属性和公有方法
类的属性
命名格式:由字母开头,总体由字母、数字和_构成
使用方法:在类外面 :对象名.属性名 在类内部 : self.属性名
类的方法
使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
命名格式:由字母开头,总体由字母、数字和_构成
使用方法:在类外面 :对象名.方法名(实参表) 在类内部 : self.方法名(实参表)
例子:class Car:
def setCarInfo(self, num, color):
self.wheelNum = num
self.color = color
def getCarInfo(self):
print("车子轮子数目是%d,车子颜色是%s"%(self.wheelNum,self.color))
def toot(self):
print("车子在鸣笛,嘟嘟....")
私有属性和私有方法
•Python中以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。•类的私有属性
命名格式:__private_attrs 由__开头,总体由字母、数字和_构成
使用方法: 只在类内部 : self.__private_attrs
类的方法
命名格式:__private_function 由__开头,总体由字母、数字和_构成
使用方法:只在类内部 : self.__private_function(实参表)
例子:class People:
def setName(self, name):
self.__name = name #访问私有属性 __name
def __getName(self): # 定义私有方法
return self.__name
def printName(self):
print('姓名是%s'%self.__getName()) # 调用私有方法 __getName()
三、多态
定义时的类型和运行时的类型不一样,此时就成为多态.
多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型 ”.
鸭子类型:
虽然我想要一只"鸭子",但是你给了我一只鸟。 但是只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子.
四、属性和方法
类属性
定义
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问
实例属性
定义:一个类的实例对象所拥有的属性
特点:独立的,一对一
拥有者:每个对象都拥有自己的实例属性
语法格式:
class 类名:
def 方法名(self):
self.属性名 #实例属性
.....
#创建类的对象后
对象名.属性名 = 值 # 第一次执行,添加新属性
类方法
类方法: 是类对象所拥有的方法
特点: @classmethod 在上面修饰 ,方法第一个参数必须是类对象
语法格式:
@classmethod
def 类方法名(cls):
执行代码
访问格式:
类名.类方法名()
实例对象名.类方法名()
应用: 访问类属性,并且可以对类属性进行修改
静态方法
静态方法: 是类对象所拥有的方法
特点: @staticmethod来进行修饰,不需要多定义参数
语法格式:
@staticmethod
def 静态方法名():
执行代码
访问格式:
类名.静态方法名()
应用: 访问类属性,并且可以对类属性进行修改
五、异常
异常
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"。
例如:f = open("Good.txt") #打开一个不存在的文件
Traceback (most recent call last):
File "error.py", line 3, in <module>
f = open("Good.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'Good.txt'
捕获多个异常——try...except...
例子1:
#!/usr/bin/python
try:
f = open("Good.txt")
print(num)
except (IOError,NameError):
pass
执行结果: 不会出现错误提示
例子2:
#!/usr/bin/python
try:
f = open("Good.txt")
print(num)
except (IOError, NameError):
print('find error')
执行结果: find error
捕获异常信息描述并存储
获取一个异常的信息描述,并存储
语法格式:
try :
可能会出现异常的语句
except 异常类型 as 存储位置变量名:
pass #表示直接略过 #或者执行的语句
捕获多条异常,并存储
语法格式:
try :
可能会出现异常的语句
except (异常类型1[, 异常类型2,....,异常类型N]) as 存储位置变量名:
pass #表示直接略过 #或者执行的语句
捕获所有异常信息——try...expect ...as...
获取所有异常的信息描述
语法格式:
try :
可能会出现异常的语句
except :
pass #表示直接略过 #或者执行的语句
捕获所有异常,并存储
语法格式:
try :
可能会出现异常的语句
except Exception as 存储位置变量名:
pass #表示直接略过 #或者执行的语句
异常传递一般会出现在try嵌套使用时和多函数之间调用,这两种情况下:
如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
抛出自定义异常—— raise语句
raise语句 : 可以引发一个异常。异常/错误对象必须有一个名字。自定义一个异常类,且它们应是Error或Exception类的子类。
语法格式:
class 自定义异常类名(Error或者Exception):
#异常类的方法....
def __init__(self, ......):
......
抛出异常语句格式:
raise 异常类名(传参列表)
例子:如图
异常处理中抛出异常
在使用try...except...中,如果出现异常,可以选择捕捉该异常,自己处理;也可以选择抛出该异常,让系统处理(默认处理)。
语法格式:添加一个判断条件,若条件为真,表示捕捉异常自己处理;若为假,可以抛出异常,系统默认处理
try:
可能产生异常的语句
except Exception as 存放位置:
if 条件:
处理该异常
else:
#重新抛出异常
raise
六、test
2.创建员工类Employee,属性有姓名name、能力值ability、年龄age(能力值为100-年龄),功能有doWork(),该方法执行一次,该员工的能力值-5,创建str方法,打印该员工的信息
3.创建老板类Boss,属性有金钱money,员工列表employeeList(存储员工类对象),工作量work,功能有雇佣员工addEmployee(),雇佣后将员工添加至列表中,雇佣一人money减5000,金额不足时不能雇佣新员工;开始工作startWork(),工作开始后,依次取出员工列表中的员工开始工作,员工能力值减少的同时总的工作量work也减少,当工作量work为0时,工作结束,调用endWork(该方法为Boss类方法,打印员工的能力值信息)方法,如果所有员工使用完后,依然没有完成工作,则提示老板需要雇佣新员工,并打印剩余工作量
4.创建Boss类对象,默认执行雇佣3个员工,年龄分别为30,40,50,然后死循环开始工作,直至工作完成。
class Employee():
def __init__(self,name,age):
self.name = name
self.ability = 100 - age
self.age = age
#print(self.name,self.ability,self.age)
def dowork(self):
if(self.ability > 5):
self.ability -= 5
return
else:
return
def str(self):
print(self.name,self.ability,self.age)
class Boss():
def __init__(self,money,work):
self.money = money
self.employeeList = []
self.work = work
def addEmployee(self,emp):
self.employeeList.append(emp)
if self.money < 5000:
print("余额不足")
return False
self.money -= 5000
def startWork(self):
for i in self.employeeList:
if (i.ability > 0):
i.dowork()
self.work -= 1
if self.work == 0:
self.endWork()
break
if self.work > 0:
print("员工不足")
print("剩余工作量为 %d" %self.work)
def endWork(self):
for i in self.employeeList:
print(i.ability)
emp1 = Employee("1",30)
emp2 = Employee("2",40)
emp3 = Employee("3",50)
bos1 = Boss(20000,3)
bos1.addEmployee(emp1)
bos1.addEmployee(emp2)
bos1.addEmployee(emp3)
bos1.startWork()