课程:Python面向对象
进度:day4

上次内容回顾

1. 运算符重载
  1)算术运算符重载
     __add__(self,rhs)  obj+3
     __sub__(self,rhs)  obj-3
     __mul__(self,rhs)  obj*3
     __truediv__(self,rhs) obj/3
     __floordiv__(self,rhs) obj//3
     __mod__(self,rhs)  obj%3
     __pow__(self,rhs)  obj**3
    
     反向算术运算符: 3+obj
     复合算术运算符: obj += 3
   2)比较运算符
     __lt__(self,rhs)   obj < 3
     __gt__(self,rhs)   obj > 3
     __eq__(self,rhs)   obj == 3
     __ne__(self,rhs)   obj != 3
     __ge__(self,rhs)   obj >= 3
     __le__(self,rhs)   obj <= 3
    
   3)一元运算符:带一个操作数
     __neg__(self)   -obj
     __pos__(self)   +obj
     __invert__(self)  ~obj
    
   4)in,not in
     __contains__(self,e)
    
   5)索引运算符重载
     __getitem__(self,i)  x=obj[i]
     __setitem__(self,i,val) obj[i]=x
     __delitem__(self,i)  del obj[i]

2. 对象的内置属性
   __dict__: 绑定对象的变量
   __class__:绑定创建本对象的类

今天的内容
1. 类属性和类方法
   1)类属性(类变量)
     - 什么是类属性:属于类,而不是对象
     - 可以通过类访问,也可通过对象访问
       ClassName.attribute  通过类访问
       objectName.attribute 通过对象访问
     - 定义:在类的所有方法之外定义
     - 特征:类变量为所有实例所共享

2)类方法:属于类而不属于对象
     - 定义方式:需要在方法前加@classmethod装饰器
     - 特征:第一个参数不是self, 而是cls
             绑定调用该方法的类而不是对象
            
             类方法不能访问对象属性
     - 访问:类.方法(), 或
    
   3)静态方法
     - 什么是静态方法:主要处理一些逻辑,
       跟类有一定的相关性,跟类没有数据交互
       (不操作类的属性)
     - 如何定义静态方法:通过@staticmethod
       装饰器进行定义,不需要传入self和cls
     - 调用:可以通过类或对象进行调用
     - 意义:对一些独立的功能或操作进行
             归类存放
            
2. 类的预置属性 
   1)__slots__属性
     作用:用来限定属性的范围,示例化对象时,
          不允许对象设置__slots__限定外的属性
          从而防止因属性填写错误导致的程序错误
     类型:允许的属性名称(字符串)构成的列表
          含有__slots__属性的类创建的对象
          没有__dict__内置属性

2)__doc__属性
     作用:绑定类中第一个没有赋值的字符串,
           可以通过help函数进行查看。__doc__
           属性主要存放类的描述信息
    示例:见staff.py
     查看:进入python交互模式,执行
             from staff import *
             help(Staff)

  1 # staff.py
  2 # 员工类,演示__slots__属性示例
  3 class Staff:
  4     "这是一个员工类"
  5     __slots__ = ["no", "name", "position"]
  6
  7     def __init__(self, no, name, position):
  8         self.no = no #员工编号
  9         self.name = name #员工姓名
 10         self.position = position #职位
 11         #self.salary = 8000  #不允许
 12
 13     def __str__(self):
 14         ret = "编号:%s, 姓名:%s, 职位:%s" %\
 15           (self.no, self.name, self.position)
 16         return ret
 17
 18     def work(self): #员工工作方法
 19         print("%s正在工作" % self.name)
 20
 21 #定义机器人类,继承自Staff类
 22 class ServiceRobot(Staff):
 23     def __init__(self, no, name, position):
 24         super().__init__(no, name, position)
 25
 26     def work(self):  #重写工作方法
 27         print("%s的工作,扫地" % self.name)
 28
 29 if __name__ == "__main__":
 30     staff = Staff("0001", "Jerry", "经理")
 31     #如果没有__slots__属性,则创建一个新属性
 32     #执行不会报错,但没有起到给属性赋值的作用
 33     #staff.positino = "副总经理"
 34     print(staff)
 35
 36     robot = ServiceRobot("0002","多啦A梦","服务员")
 37     print(robot)
 38     robot.work()

staff.py

3. 类的关系设计(理解)
   1)继承关系
      - 描述子类、父类之间的关系
      - 子类和父类是"是一个XX"的关系
     
   2)组合关系
      - 一个对象中嵌入了另一个对象
        描述"有一个"的关系
        整体包含部分的关系
     
   3)关联关系 
      - 一个类中嵌套了另一个类,但是这两个
        类是平等关系,而不是局部和整体的关系
      - 关联可以是单向,也可是双向
     
      示例代码:见chain_store.py

  1 # staff.py
  2 # 员工类,演示__slots__属性示例
  3 class Staff:
  4     "这是一个员工类"
  5     __slots__ = ["no", "name", "position"]
  6
  7     def __init__(self, no, name, position):
  8         self.no = no #员工编号
  9         self.name = name #员工姓名
 10         self.position = position #职位
 11         # self.salary = 8000  #不允许
 12
 13     def __str__(self):
 14         ret = "编号:%s, 姓名:%s, 职位:%s" %\
 15           (self.no, self.name, self.position)
 16         return ret
 17
 18     def work(self): #员工工作方法
 19         print("%s正在工作" % self.name)
 20
 21 #定义机器人类,继承自Staff类
 22 class ServiceRobot(Staff):
 23     def __init__(self, no, name, position):
 24         super().__init__(no, name, position)
 25
 26     def work(self):  #重写工作方法
 27         print("%s的工作,扫地" % self.name)
 28
 29 if __name__ == "__main__":
 30     staff = Staff("0001", "Jerry", "经理")
 31     #如果没有__slots__属性,则创建一个新属性
 32     #执行不会报错,但没有起到给属性赋值的作用
 33     # staff.positino = "副总经理"
 34     print(staff)
 35
 36     robot = ServiceRobot("0002","多啦A梦","服务员")
 37     print(robot)
 38     robot.work()

staff.py

  1 # customer.py
  2 # 客户类
  3 class Customer: #客户类
  4     def __init__(self,cust_id,cust_name,tel_no):
  5         self.cust_id = cust_id
  6         self.cust_name = cust_name
  7         self.tel_no = tel_no
  8
  9     def __str__(self):
 10         ret = "客户编号:%s,客户名称:%s,电话:%s" \
 11           %(self.cust_id, self.cust_name, self.tel_no)
 12         return ret

customer.py

  1 # chain_store.py
  2 # 连锁店类,类属性/类方法示例
  3 from staff import *
  4 from customer import *
  5
  6 class ChainStore:
  7     #类属性
  8     store_num = 0   #连锁店门店数量
  9     total_income = 0  #所有门店总营业额
 10     store_list = []   #所有门店对象列表
 11     cust_list = []    #所有会员列表
 12
 13     def __init__(self,store_no,store_name,
 14                  address, manager):
 15         print("门店开张")
 16         self.store_no = store_no #编号
 17         self.store_name = store_name #名称
 18         self.address = address #地址
 19         self.manager = manager #经理
 20         self.myincome = 0 #本店营业额度
 21         ChainStore.store_num += 1 #门店开张,总数量加1
 22         ChainStore.store_list.append(self)#添加当前对象到列表
 23
 24         self.staff_list = [] #连锁店包含一组员工,组合关系
 25
 26     def add_staff(self, staff): #添加员工
 27         self.staff_list.append(staff)
 28
 29     def remove_staff(self, no): #删除员工
 30         for staff in self.staff_list:
 31             if staff.no == no:
 32                 self.staff_list.remove(staff)
 33
 34     def print_all_staff(self): #打印所有员工信息
 35         for staff in self.staff_list:
 36             print(staff)
 37
 38     def do_business(self, income): #营业
 39         print("正在营业")
 40         self.myincome += income #营业额累加
 41         # 将本店的营业额度累加到总营业额度
 42         ChainStore.total_income += income
 43
 44     def __str__(self): #重写__str__()
 45         ret="编号:%s,名称:%s,地址:%s,店长:%s,总营业额:%.2f"\
 46             %(self.store_no, self.store_name,
 47             self.address,self.manager, self.myincome)
 48         return ret
 49
 50     def __del__(self):  #析构函数
 51         print("%s门店关闭" % self.store_name)
 52         ChainStore.store_num -= 1  #减少一家门店
 53
 54     @classmethod
 55     def print_total(cls): #类方法,打印类的属性
 56         print("门店数量:%d, 营业总额度:%.2f" %\
 57              (cls.store_num, cls.total_income))
 58         for store in cls.store_list: #遍历门店列表
 59             print(str(store))
 60
 61     @staticmethod
 62     def print_regulation(): #静态方法,打印管理条例
 63         regulation = '''
 64         --------- 连锁店管理条例 ---------
 65         第一条 考勤
 66         第一款 不迟到,不早退,不旷工
 67         第二款 有事向经理请假
 68         ...
 69
 70         第二条 服务规范
 71         ...
 72         '''
 73         print(regulation)
 74
 75     def cust_reg(self, cust): #会员注册
 76         ChainStore.cust_list.append(cust)
 77
 78     def print_cust_info(self): #打印会员
 79         for cust in ChainStore.cust_list:
 80             print(cust)
 81
 82 if __name__ == "__main__":
 83     # 第一家分店
 84     store1 = ChainStore("1","西单旗舰店","西单","Jerry")
 85     store1.add_staff(Staff("0001","Jerry","店长"))
 86     store1.add_staff(Staff("0002","Tom","Pizza制作师"))
 87     store1.add_staff(ServiceRobot("0003","哆啦A梦","服务员"))
 88     store1.print_all_staff()  #打印所有员工信息
 89
 90     store1.do_business(20000) #营业
 91     ChainStore.print_total() #调用类方法
 92     print("")
 93     store1.cust_reg(Customer("1","八戒","13522334455"))
 94     store1.cust_reg(Customer("2","悟空","13899887766"))
 95     store1.print_cust_info()  #打印会员信息
 96
 97     # print("")
 98     # # 第二家分店
 99     store2 = ChainStore("2","中关村店","中关村","李小小")
100     store2.do_business(25000) #营业
101     del store2   #销毁store2对象
102
103     print("程序退出")
104     # ChainStore.print_total() #调用类方法
105
106     # ChainStore.print_regulation() #通过类调用静态方法
107     # store2.print_regulation() #通过对象调用静态方法
108 

chain_store.py

4. with语句
   1)作用:在访问某些资源时,不管有没有发生
      异常,都确保能够执行必须的清理操作,
      并释放资源(类似于try-finally作用)
   2)语法
      with 表达式1 [as 变量1][,表达式2 [as 变量2]]
         语句块
      例如:文件打开后自动关闭
            线程资源的释放(系统编程阶段学习)

3)实现原理:环境资源管理器(上下文管理器)
     - 定义了__enter__()和__exit__()方法的
       对象称为环境资源管理器
     - 调用时机:__enter__()方法在with语句被
                 执行时调用
                 __exit__()方法with语句结束时被调用

- 格式:
       __enter__(self)   略
       __exit__(self, exc_type, exc_val, exc_tb)
         参数:exc_type 异常类型,没有异常为None
              exc_val 绑定异常对象,没有异常为None
              exc_tb 绑定TrackBack对象,没有异常为None

  1 aaa
  2 bbb
  3 ccc
  4 

a.txt

  1 # with.py
  2 # with语句示例
  3 # try:
  4 #     #f = open("aaa.txt", "rt")
  5 #     # 使用with语句,不管以下的操作是否
  6 #     # 发生异常,都能保证文件被正确关闭
  7 #     with open("a.txt", "rt") as f:
  8 #         for line in f:
  9 #             print(line,end="")
 10 #     # with语句结束
 11 # except:
 12 #     print("文件操作失败")
 13
 14 class A:  #自定义资源管理器
 15     def __init__(self, name):
 16         self.name = name
 17
 18     def __enter__(self):
 19         print("__enter__()方法被执行")
 20         return self
 21
 22     def __exit__(self, exc_type, exc_val,exc_tb):
 23         print("__exit__()方法被执行")
 24         if exc_type is None: #没有出现异常
 25             print("没有出现异常")
 26         else: # 出现异常
 27             print("错误类型:", exc_type)
 28             print("错误对象:", exc_val)
 29             print("TraceBack:", exc_tb)
 30
 31 if __name__ == "__main__":
 32     with A("test_name") as a:
 33         print("with语句执行了")
 34         # 制造或不制造异常
 35         a = int(input("请输入一个数字:"))
 36
 37     print("程序退出")

with.py

作业:
编写一个程序,模拟扫福,各种福的概率如下:
爱国福 30%
敬业福 10%
和谐福 30%
友善福 20%
富强福 10%
编写代码进行模拟

转载于:https://www.cnblogs.com/shengjia/p/10387711.html

PYTHON1.面向对象_day04相关推荐

  1. python基础以及面向对象

    python基础 python基础 第一单元 Python解释器和IDE的安装和初步使用 **一.昨日知识点回顾** **二.本单元知识点概述** (Ⅰ)指定教材 (Ⅱ)知识点概述 (Ⅲ)教学时长 * ...

  2. 10.Python面向对象编程

    配套视频教程 本文B站配套视频教程 类和对象 万物皆对象 分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地将对象进行进行分类 对象归类 类是抽象的概念,仅仅是模板 比如说:"人& ...

  3. python浓缩(13)面向对象编程

    为什么80%的码农都做不了架构师?>>>    本章主题 ? 引言 ? 面向对象编程 ? 类 ? 实例 ? 绑定与方法调用 ? 子类,派生和继承 ? 内建函数 ? 定制类 ? 私有性 ...

  4. 设计模式 by Python1:策略模式

    设计模式 by Python1:策略模式 最近开始重新看<Head First 设计模式>,作为一个不错的练习,打算在整理设计模式笔记的时候用Python实现. 作为第一个介绍的设计模式, ...

  5. 【AJAX】JavaScript的面向对象

    Ajax中后端数据返回后需要前端通过JavaScript来实现动态数据更新的问题.所以,在Ajax中加深了一遍JavaScript面向对象的印象. 基础部分: JavaScript中创建对象并简单对象 ...

  6. 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

    AutoSAR入门到精通系列讲解 将从2019年开始更新关于AutoSAR的知识,从入门到精通,博主xyfx和大家一起进步 雪云飞星 ¥29.90 去订阅 简单地说结构化分析方法主要用来分析系统的功能 ...

  7. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

    目录 scala面向对象 MAVEN依赖 类 - 掌握 创建类和对象 - 掌握 getter/setter - 了解 类的构造器 - 掌握 scala面向对象 MAVEN依赖 <?xml ver ...

  8. php面向对象程序设计,PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: class Person { private $name; private $sex; private $age; ...

  9. java面向过程和面向对象

    面向过程(Procedure Oriented):说的是功能的行为 面向对象(Object Oriented,简称OO):说的是功能的对象 面向过程理解: 当学习java的时候先了解java语言优良的 ...

最新文章

  1. mysql8导出文件_windows下 Mysql 8.0.x 数据库简单的导出和导入!!!
  2. Nodejs学习笔记(六)——Mysql模块
  3. 第一序列任小粟的能力_末世废土文—《第一序列》:“这世间,已经不需要齐天大圣了。”...
  4. iOS:实现邮件和短信发送的简单示例
  5. 给文章中重复标签排序
  6. BZOJ 5319: [Jsoi2018]军训列队(可持久化线段树)
  7. 强网杯2019线上赛-misc
  8. selenium+java+chrome环境搭建
  9. 分享github好用的磁力站bt导航和阿里云盘导航、百度网盘搜索引擎导航
  10. php转jsp,阿里西西Html多功能代码转换器(html转js/jsp/php工具)
  11. 用正则表达式进行身份证验证
  12. fatal: The remote end hung up unexpectedly解决方案
  13. IOS汉字转拼音首字母
  14. 【B站】Java自学精选视频,Java全套资源奉上,收藏起来慢慢学
  15. Win11玩不了红警怎么办?Win11玩不了红警解决方法分享
  16. Qt之QVector基本用法
  17. veket linux能运行qq么,【veket系统】Veket Linux系统下载 v8.07 官方正式版-开心电玩...
  18. 【大数据之Linux】
  19. matlab输入错误怎么修改,matlab 一个错误 怎么修改
  20. 西门子S7-1200 S7-1500PLC编程案例,包含V90PN通讯,G120变频器 RFID模块

热门文章

  1. 利用java实现的一个发送手机短信的小例子
  2. Redhat系统下三种主要的软件包安装方法
  3. python测验7编程题_2020大学moocPython编程基础章节测验答案
  4. python 批量创建线程_【Python】批量创建线程
  5. android intent 跳转卡顿_Intent七大属性
  6. python需要安装的库_使用python学习【机器学习】需要安装的库~
  7. linux时钟告警,Linux记录-告警脚本
  8. 2000以内最好的无人机_全球军用无人机排行榜之国产翔龙无人机
  9. amd 深度学习模型部署_Web服务部署深度学习模型-续集
  10. android 城市列表数据,用RecyclerView写的城市列表