python——面向对象(下)

文章介绍了Python中面向对象编程的关键概念,包括继承(子类重写和调用父类属性及方法)、私有属性和方法的使用,多态的原理,以及属性和方法的分类。同时,详细阐述了异常处理机制,如try...except结构和异常传递,并给出了自定义异常的例子。最后,通过一个Employee和Boss类的案例展示了这些概念的实际应用。
摘要由CSDN通过智能技术生成

目录

一、继承

二、私有属性私有方法

三、多态

四、属性和方法

五、异常

六、test


一、继承

故事继续:大猫掌握了 师傅的配方 和 学校的配方,通过研究,大猫在两个配方的基础上,创建了一种全新的煎饼果子配方,称之为 "猫氏煎饼果子配方"。(子类重写父类同名属性和方法)

 子类重写父类同名属性的方法

 

故事继续:大猫的新配方大受欢迎,但是有些顾客希望也能吃到古法配方和 现代配方 的煎饼果子...(子类调用父类的同名属性和方法)

 子类调用父类同名属性

 

故事继续:大猫的煎饼果子店非常红火,终于有一天,他成了世界首富!!

但是他也老了,所以他希望把 师傅的配方 和 学校的配方 以及自己的配方 继续传承下去...(多层继承)

 

 

 

 

二、私有属性私有方法

公有属性和公有方法

类的属性

命名格式:由字母开头,总体由字母、数字和_构成

使用方法:在类外面 :对象名.属性名  在类内部 : 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值