• 第三章 面向对象及相关


    1. 编程思想
       1 '''
       2 面向过程:核心是过程二字,过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式
       3 优点:复杂的问题流程化,进而简单化
       4 缺点:可扩展性差
       5 '''
       6 
       7 import json
       8 import re
       9 def interactive():
      10     name=input('>>: ').strip()
      11     pwd=input('>>: ').strip()
      12     email=input('>> ').strip()
      13     return {
      14         'name':name,
      15         'pwd':pwd,
      16         'email':email
      17     }
      18 
      19 def check(user_info):
      20     is_valid=True
      21 
      22     if len(user_info['name']) == 0:
      23         print('用户名不能为空')
      24         is_valid=False
      25 
      26     if len(user_info['pwd']) < 6:
      27         print('密码不能少于6位')
      28         is_valid=False
      29 
      30     if not re.search(r'@.*?.com$',user_info['email']):
      31         print('邮箱格式不合法')
      32         is_valid=False
      33 
      34     return {
      35         'is_valid':is_valid,
      36         'user_info':user_info
      37     }
      38 
      39 def register(check_info):
      40     if check_info['is_valid']:
      41         with open('db.json','w',encoding='utf-8') as f:
      42             json.dump(check_info['user_info'],f)
      43 
      44 
      45 
      46 def main():
      47     user_info=interactive()
      48 
      49     check_info=check(user_info)
      50 
      51     register(check_info)
      52 
      53 if __name__ == '__main__':
      54     main()
      面向过程编程
       1 '''
       2 面向对象:核心就是对象二字,对象就是特征与技能的结合体
       3 优点:可扩展性强
       4 缺点:编程复杂度高
       5 应用场景:用户需求经常变化,互联网应用,游戏,企业内部应用
       6 
       7 
       8 类就是一系列对象相似的特征与技能的结合体
       9 强调:站在不同的角度,得到的分类是不一样的
      10 
      11 在现实世界中:一定先有对象,后有类
      12 在程序中:一定得先定义类,后调用类来产生对象
      13 
      14 站在路飞学院的角度,大家都是学生
      15 
      16 在现实世界中:
      17     对象1:王二丫
      18         特征:
      19             学校='luffycity'
      20             名字='王二丫'
      21             性别='女'
      22             年龄=18
      23         技能:
      24             学习
      25             吃饭
      26             睡觉
      27 
      28     对象2:李三炮
      29         特征:
      30             学校='luffycity'
      31             名字='李三炮'
      32             性别='男'
      33             年龄=38
      34         技能:
      35             学习
      36             吃饭
      37             睡觉
      38 
      39     对象3:张铁蛋
      40         特征:
      41             学校='luffycity'
      42             名字='张铁蛋'
      43             性别='男'
      44             年龄=48
      45         技能:
      46             学习
      47             吃饭
      48             睡觉
      49 
      50     总结现实中路飞学院的学生类:
      51         相似的特征
      52             学校='luffycity'
      53 
      54         相似的技能
      55             学习
      56             吃饭
      57             睡觉
      58 
      59 
      60 '''
      61 
      62 #先定义类
      63 class LuffyStudent:
      64     school='luffycity'
      65 
      66     def learn(self):
      67         print('is learning')
      68 
      69     def eat(self):
      70         print('is sleeping')
      71 
      72 
      73 #后产生对象
      74 stu1=LuffyStudent()
      75 stu2=LuffyStudent()
      76 stu3=LuffyStudent()
      77 
      78 print(stu1)
      79 print(stu2)
      80 print(stu3)
      面向对象编程
    2. 类的使用(一)
       1 先定义类
       2 class LuStudent:
       3     school='luffycity' #数据属性
       4 
       5 
       6     def learn(self): #函数属性
       7         print('is learning')
       8 
       9     def eat(self): #函数属性
      10         print('is sleeping')
      11 
      12 
      13 #查看类的名称空间
      14 #print(LuStudent.__dict__)
      15 #print(LuStudent.__dict__['school'])
      16 #print(LuStudent.__dict__['learn'])
      17 
      18 
      19 #
      20 #print(LuffyStudent.school) #LuffyStudent.__dict__['school']
      21 #print(LuffyStudent.learn) #LuffyStudent.__dict__['learn']
      22 
      23 #
      24 LuffyStudent.county='China'
      25 # print(LuffyStudent.__dict__)
      26 print(LuffyStudent.county)
      27 
      28 #
      29 del LuffyStudent.county
      30 
      31 #
      32 LuffyStudent.school='Lucity'
      类的基本使用
        1 #__init__方法用来为对象定制对象自己独有的特征
        2 class LuStudent:
        3     school='lucity'
        4 
        5     #            stu1, '王二丫', '女', 18
        6     def __init__(self,name,sex,age):
        7         self.Name=name
        8         self.Sex=sex
        9         self.Age=age
       10 
       11         #stu1.Name='王二丫'
       12         #stu1.Sex='女'
       13         #stu1.Age=18
       14 
       15     def learn(self):
       16         print('is learning')
       17 
       18     def eat(self):
       19         print('is sleeping')
       20 
       21 
       22 #后产生对象
       23 stu1=LuStudent('王二丫','',18) #LuStudent.__init__(stu1,'王二丫','女',18)
       24 
       25 #加上__init__方法后,实例化的步骤
       26 # 1、先产生一个空对象stu1
       27 # 2、LuStudent.__init__(stu1,'王二丫','女',18)
       28 
       29 
       30 #
       31 print(stu1.__dict__)
       32 #print(stu1.Name)
       33 #print(stu1.Sex)
       34 #print(stu1.Age)
       35 
       36 #
       37 # stu1.Name='李二丫'
       38 # print(stu1.__dict__)
       39 # print(stu1.Name)
       40 
       41 
       42 #删除
       43 # del stu1.Name
       44 # print(stu1.__dict__)
       45 #
       46 # #增
       47 # stu1.class_name='python开发'
       48 # print(stu1.__dict__)
       49 #
       50 #
       51 # stu2=LuStudent('李三炮','男',38) #Lucity.__init__(stu2,'李三炮','男',38)
       52 # print(stu2.__dict__)
       53 # print(stu2.Name)
       54 # print(stu2.Age)
       55 # print(stu2.Sex)
       56 
       57 # 类的属性查找
       58 '''
       59 在现实世界中:
       60     对象1:王二丫
       61         特征:
       62             学校='luffycity'
       63             名字='王二丫'
       64             性别='女'
       65             年龄=18
       66         技能:
       67             学习
       68             吃饭
       69             睡觉
       70 
       71     对象2:李三炮
       72         特征:
       73             学校='luffycity'
       74             名字='李三炮'
       75             性别='男'
       76             年龄=38
       77         技能:
       78             学习
       79             吃饭
       80             睡觉
       81 
       82     对象3:张铁蛋
       83         特征:
       84             学校='luffycity'
       85             名字='张铁蛋'
       86             性别='男'
       87             年龄=48
       88         技能:
       89             学习
       90             吃饭
       91             睡觉
       92 
       93     总结现实中路飞学院的学生类:
       94         相似的特征
       95             学校='luffycity'
       96 
       97         相似的技能
       98             学习
       99             吃饭
      100             睡觉
      101 
      102 '''
      103 x='global'
      104 class LuStudent:
      105     school='lucity'
      106 
      107     def __init__(self,name,sex,age):
      108         self.Name=name
      109         self.Sex=sex
      110         self.Age=age
      111 
      112         #stu1.Name='王二丫'
      113         #stu1.Sex='女'
      114         #stu1.Age=18
      115 
      116     def learn(self,x):
      117         print('%s is learning %s' %(self.Name,x))
      118 
      119     def eat(self):
      120         print('%s is sleeping' %self.Name)
      121 
      122 
      123 #后产生对象
      124 stu1=LuStudent('王二丫','',18)
      125 stu2=LuStudent('李三炮','',38)
      126 stu3=LuStudent('张铁蛋','',48)
      127 # print(stu1.__dict__)
      128 # print(stu2.__dict__)
      129 # print(stu3.__dict__)
      130 
      131 
      132 
      133 #对象:特征与技能的结合体
      134 #类:类是一系列对象相似的特征与相似的技能的结合体
      135 
      136 
      137 
      138 #类中的数据属性:是所以对象共有的
      139 # print(LuStudent.school,id(LuStudent.school))
      140 #
      141 # print(stu1.school,id(stu1.school))
      142 # print(stu2.school,id(stu2.school))
      143 # print(stu3.school,id(stu3.school))
      144 
      145 
      146 #类中的函数属性:是绑定给对象使用的,绑定到不同的对象是不同的绑定方法,对象调用绑定方式时,会把对象本身当作第一个传入,传给self
      147 
      148 # print(LuStudent.learn)
      149 # LuffyStudent.learn(stu1)
      150 # LuffyStudent.learn(stu2)
      151 # LuffyStudent.learn(stu3)
      152 
      153 
      154 # print(stu1.learn)
      155 # stu1.learn(1) #learn(stu1,1)
      156 # print(stu2.learn)
      157 # print(stu3.learn)
      158 
      159 # 补充
      160 #python一切皆对象,在python3里统一类类与类型的概念
      161 
      162 
      163 # print(type([1,2]))
      164 
      165 
      166 # print(list)
      167 
      168 class LuStudent:
      169     school='lucity'
      170 
      171     def __init__(self,name,sex,age):
      172         self.Name=name
      173         self.Sex=sex
      174         self.Age=age
      175 
      176         #stu1.Name='王二丫'
      177         #stu1.Sex='女'
      178         #stu1.Age=18
      179 
      180     def learn(self,x):
      181         print('%s is learning %s' %(self.Name,x))
      182 
      183     def eat(self):
      184         print('%s is sleeping' %self.Name)
      185 
      186 
      187 # print(LuffyStudent)
      188 
      189 
      190 l1=[1,2,3] #l=list([1,2,3])
      191 l2=[] #l=list([1,2,3])
      192 # l1.append(4) #list.append(l1,4)
      193 list.append(l1,4)
      194 print(l1)
      195 
      196 小结
      197 class Chinese:
      198     county='China'
      199     def __init__(self,name,age,sex):
      200         self.name=name
      201         self.age=age
      202         self.sex=sex
      203     def eat(self):
      204         print('%s is eating' %self.name)
      205 
      206 p1=Chinese('eg',18,'male')
      207 p2=Chinese('al',38,'female')
      208 p3=Chinese('wpq',48,'female')
      209 
      210 # print(p1.county)
      211 # print(p2.county)
      212 # print(p3.county)
      213 
      214 p1.eat()
      215 p2.eat()
      216 p3.eat()
      类的__init__,&属性查找..
       1 '''
       2 练习1:编写一个学生类,产生一堆学生对象, (5分钟)
       3 
       4 要求:
       5 
       6 有一个计数器(属性),统计总共实例了多少个对象
       7 '''
       8 
       9 class Student:
      10     school='luffycity'
      11     count=0
      12 
      13     def __init__(self,name,age,sex):
      14         self.name=name
      15         self.age=age
      16         self.sex=sex
      17         # self.count+=1
      18         Student.count+=1
      19 
      20     def learn(self):
      21         print('%s is learing' %self.name)
      22 
      23 
      24 stu1=Student('alex','male',38)
      25 stu2=Student('jinxing','female',78)
      26 stu3=Student('egon','male',18)
      27 
      28 #
      29 # print(Student.count)
      30 # print(stu1.count)
      31 # print(stu2.count)
      32 # print(stu3.count)
      33 # print(stu1.__dict__)
      34 # print(stu2.__dict__)
      35 # print(stu3.__dict__)
      36 
      37 
      38 
      39 '''
      40 练习2:模仿LoL定义两个英雄类, (10分钟)
      41 
      42 要求:
      43 
      44 英雄需要有昵称、攻击力、生命值等属性;
      45 实例化出两个英雄对象;
      46 英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定为死亡。
      47 '''
      48 
      49 class Garen:
      50     camp='Demacia'
      51 
      52     def __init__(self,nickname,life_value,aggresivity):
      53         self.nickname=nickname
      54         self.life_value=life_value
      55         self.aggresivity=aggresivity
      56 
      57     def attack(self,enemy):
      58         enemy.life_value-=self.aggresivity
      59         #r1.life_value-=g1.aggresivity
      60 
      61 class Riven:
      62     camp = 'Noxus'
      63 
      64     def __init__(self, nickname, life_value, aggresivity):
      65         self.nickname = nickname
      66         self.life_value = life_value
      67         self.aggresivity = aggresivity
      68 
      69     def attack(self, enemy):
      70         enemy.life_value -= self.aggresivity
      71 
      72 g1=Garen('草丛伦',100,30)
      73 
      74 r1=Riven('可爱的锐雯雯',80,50)
      75 
      76 print(r1.life_value)
      77 g1.attack(r1)
      78 print(r1.life_value)
      练习
       1 # class ParentClass1:
       2 #     pass
       3 #
       4 # class ParentClass2:
       5 #     pass
       6 #
       7 # class SubClass1(ParentClass1):
       8 #     pass
       9 #
      10 # class SubClass2(ParentClass1,ParentClass2):
      11 #     pass
      12 #
      13 # print(SubClass1.__bases__)
      14 # print(SubClass2.__bases__)
      15 
      16 
      17 
      18 # class Hero:
      19 #     x=3
      20 #     def __init__(self,nickname,life_value,aggresivity):
      21 #         self.nickname=nickname
      22 #         self.life_value=life_value
      23 #         self.aggresivity=aggresivity
      24 #     def attack(self,enemy):
      25 #         enemy.life_value-=self.aggresivity
      26 #
      27 # class Garen(Hero):
      28 #     # x=2
      29 #     pass
      30 
      31 # class Riven(Hero):
      32 #     pass
      33 
      34 
      35 # g1=Garen('刚们',29,30)
      36 # # print(g1.nickname,g1.life_value,g1.aggresivity)
      37 # # g1.x=1
      38 #
      39 # print(g1.x)
      40 
      41 
      42 
      43 #属性查找小练习
      44 class Foo:
      45     def f1(self):
      46         print('from Foo.f1')
      47 
      48     def f2(self):
      49         print('from Foo.f2')
      50         self.f1() #b.f1()
      51 
      52 class Bar(Foo):
      53     def f1(self):
      54         print('from Bar.f1')
      55 
      56 b=Bar()
      57 # print(b.__dict__)
      58 b.f2()
      类的继承
       1 #1、新式类
       2 
       3 #2、经典类
       4 
       5 #在python2中-》经典类:没有继承object的类,以及它的子类都称之为经典类
       6 #
       7 # class Foo:
       8 #     pass
       9 #
      10 # class Bar(Foo):
      11 #     pass
      12 #
      13 #
      14 # #在python2中-》新式类:继承object的类,以及它的子类都称之为新式类
      15 # class Foo(object):
      16 #     pass
      17 #
      18 # class Bar(Foo):
      19 #     pass
      20 
      21 
      22 #在python3中-》新式类:一个类没有继承object类,默认就继承object
      23 
      24 # class Foo():
      25 #     pass
      26 # print(Foo.__bases__)
      27 
      28 
      29 #验证多继承情况下的属性查找
      30 
      31 class A:
      32     # def test(self):
      33     #     print('from A')
      34     pass
      35 
      36 class B(A):
      37     # def test(self):
      38     #     print('from B')
      39     pass
      40 
      41 class C(A):
      42     # def test(self):
      43     #     print('from C')
      44     pass
      45 
      46 class D(B):
      47     # def test(self):
      48     #     print('from D')
      49     pass
      50 
      51 class E(C):
      52     # def test(self):
      53     #     print('from E')
      54     pass
      55 
      56 class F(D,E):
      57     # def test(self):
      58     #     print('from F')
      59     pass
      60 
      61 
      62 #F,D,B,E,C,A
      63 
      64 print(F.mro())
      65 # f=F()
      66 # f.test()
      继承的实现原理
        1 #在子类派生出的新的方法中重用父类的方法,有两种实现方式
        2 #方式一:指名道姓(不依赖继承)
        3 # class Hero:
        4 #     def __init__(self,nickname,life_value,aggresivity):
        5 #         self.nickname=nickname
        6 #         self.life_value=life_value
        7 #         self.aggresivity=aggresivity
        8 #     def attack(self,enemy):
        9 #         enemy.life_value-=self.aggresivity
       10 #
       11 #
       12 # class Garen(Hero):
       13 #     camp='Demacia'
       14 #
       15 #     def attack(self,enemy):
       16 #         Hero.attack(self,enemy) #指名道姓
       17 #         print('from Garen Class')
       18 #
       19 # class Riven(Hero):
       20 #     camp='Noxus'
       21 #
       22 #
       23 # g=Garen('草丛伦',100,30)
       24 # r=Riven('锐雯雯',80,50)
       25 #
       26 # print(r.life_value)
       27 # g.attack(r)
       28 # print(r.life_value)
       29 
       30 
       31 
       32 
       33 # class Hero:
       34 #     def __init__(self,nickname,life_value,aggresivity):
       35 #         self.nickname=nickname
       36 #         self.life_value=life_value
       37 #         self.aggresivity=aggresivity
       38 #     def attack(self,enemy):
       39 #         enemy.life_value-=self.aggresivity
       40 
       41 
       42 # class Garen(Hero):
       43 #     camp='Demacia'
       44 #
       45 #     def __init__(self,nickname,life_value,aggresivity,weapon):
       46 #         # self.nickname=nickname
       47 #         # self.life_value=life_value
       48 #         # self.aggresivity=aggresivity
       49 #         Hero.__init__(self,nickname,life_value,aggresivity)
       50 #
       51 #         self.weapon=weapon
       52 #
       53 #     def attack(self,enemy):
       54 #         Hero.attack(self,enemy) #指名道姓
       55 #         print('from Garen Class')
       56 #
       57 #
       58 # g=Garen('草丛伦',100,30,'金箍棒')
       59 #
       60 # print(g.__dict__)
       61 
       62 
       63 
       64 
       65 #方式二:super() (依赖继承)
       66 # class Hero:
       67 #     def __init__(self,nickname,life_value,aggresivity):
       68 #         self.nickname=nickname
       69 #         self.life_value=life_value
       70 #         self.aggresivity=aggresivity
       71 #     def attack(self,enemy):
       72 #         enemy.life_value-=self.aggresivity
       73 #
       74 #
       75 # class Garen(Hero):
       76 #     camp='Demacia'
       77 #
       78 #     def attack(self,enemy):
       79 #         super(Garen,self).attack(enemy) #依赖继承
       80 #         print('from Garen Class')
       81 #
       82 # class Riven(Hero):
       83 #     camp='Noxus'
       84 #
       85 #
       86 # g=Garen('草丛伦',100,30)
       87 # r=Riven('锐雯雯',80,50)
       88 #
       89 # g.attack(r)
       90 # print(r.life_value)
       91 
       92 
       93 # class Hero:
       94 #     def __init__(self,nickname,life_value,aggresivity):
       95 #         self.nickname=nickname
       96 #         self.life_value=life_value
       97 #         self.aggresivity=aggresivity
       98 #     def attack(self,enemy):
       99 #         enemy.life_value-=self.aggresivity
      100 #
      101 #
      102 # class Garen(Hero):
      103 #     camp='Demacia'
      104 #
      105 #     def __init__(self,nickname,life_value,aggresivity,weapon):
      106 #         # self.nickname=nickname
      107 #         # self.life_value=life_value
      108 #         # self.aggresivity=aggresivity
      109 #
      110 #         # super(Garen,self).__init__(nickname,life_value,aggresivity)
      111 #         super().__init__(nickname,life_value,aggresivity)
      112 #         self.weapon=weapon
      113 #
      114 #     def attack(self,enemy):
      115 #         Hero.attack(self,enemy) #指名道姓
      116 #         print('from Garen Class')
      117 #
      118 #
      119 # g=Garen('草丛伦',100,30,'金箍棒')
      120 #
      121 # print(g.__dict__)
      122 
      123 
      124 
      125 
      126 
      127 
      128 
      129 
      130 class A:
      131     def f1(self):
      132         print('from A')
      133         super().f1()
      134 
      135 
      136 class B:
      137     def f1(self):
      138         print('from B')
      139 
      140 class C(A,B):
      141     pass
      142 
      143 
      144 print(C.mro())
      145 #[<class '__main__.C'>,
      146 # <class '__main__.A'>,
      147 # <class '__main__.B'>,
      148 # <class 'object'>]
      149 
      150 
      151 c=C()
      152 c.f1()
      子类中重用父类属性
       1 class People:
       2     school='luffycity'
       3 
       4     def __init__(self,name,age,sex):
       5         self.name=name
       6         self.age=age
       7         self.sex=sex
       8 
       9 
      10 class Teacher(People):
      11     def __init__(self,name,age,sex,level,salary,):
      12         super().__init__(name,age,sex)
      13 
      14         self.level=level
      15         self.salary=salary
      16 
      17 
      18     def teach(self):
      19         print('%s is teaching' %self.name)
      20 
      21 
      22 class Student(People):
      23     def __init__(self, name, age, sex, class_time,):
      24         super().__init__(name,age,sex)
      25 
      26         self.class_time=class_time
      27 
      28     def learn(self):
      29         print('%s is learning' % self.name)
      30 
      31 class Course:
      32     def __init__(self,course_name,course_price,course_period):
      33         self.course_name = course_name
      34         self.course_price = course_price
      35         self.course_period = course_period
      36 
      37     def tell_info(self):
      38         print('课程名<%s> 课程价钱<%s> 课程周期<%s>' %(self.course_name,self.course_price,self.course_period))
      39 
      40 class Date:
      41     def __init__(self,year,mon,day):
      42         self.year=year
      43         self.mon=mon
      44         self.day=day
      45 
      46     def tell_info(self):
      47         print('%s-%s-%s' %(self.year,self.mon,self.day))
      48 
      49 # teacher1=Teacher('alex',18,'male',10,3000,)
      50 # teacher2=Teacher('egon',28,'male',30,3000,)
      51 # python=Course('python',3000,'3mons')
      52 # linux=Course('linux',2000,'4mons')
      53 
      54 # print(python.course_name)
      55 
      56 # teacher1.course=python
      57 # teacher2.course=python
      58 
      59 # print(python)
      60 # print(teacher1.course)
      61 # print(teacher2.course)
      62 # print(teacher1.course.course_name)
      63 # print(teacher2.course.course_name)
      64 # teacher1.course.tell_info()
      65 
      66 # student1=Student('张三',28,'female','08:30:00')
      67 # student1.course1=python
      68 # student1.course2=linux
      69 
      70 # student1.course1.tell_info()
      71 # student1.course2.tell_info()
      72 # student1.courses=[]
      73 # student1.courses.append(python)
      74 # student1.courses.append(linux)
      75 
      76 
      77 
      78 student1=Student('张三',28,'female','08:30:00')
      79 d=Date(1988,4,20)
      80 python=Course('python',3000,'3mons')
      81 
      82 
      83 student1.birh=d
      84 student1.birh.tell_info()
      85 
      86 student1.course=python
      87 
      88 student1.course.tell_info()
      组合
       1 import abc
       2 
       3 class Animal(metaclass=abc.ABCMeta): #只能被继承,不能被实例化
       4     all_type='animal'
       5 
       6     @abc.abstractmethod
       7     def run(self):
       8         pass
       9 
      10     @abc.abstractmethod
      11     def eat(self):
      12         pass
      13 
      14 # animal=Animal()
      15 
      16 
      17 class People(Animal):
      18     def run(self):
      19         print('people is running')
      20 
      21     def eat(self):
      22         print('people is eating')
      23 
      24 class Pig(Animal):
      25     def run(self):
      26         print('people is walking')
      27 
      28     def eat(self):
      29         print('people is eating')
      30 
      31 class Dog(Animal):
      32     def run(self):
      33         print('people is walking')
      34 
      35     def eat(self):
      36         print('people is eating')
      37 
      38 
      39 # peo1=People()
      40 # pig1=Pig()
      41 # dog1=Dog()
      42 # #
      43 # #
      44 # peo1.eat()
      45 # pig1.eat()
      46 # dog1.eat()
      47 #
      48 # print(peo1.all_type)
      抽象类(metaclass=abc.ABCMeta)
       1 #多态:同一类事物的多种形态
       2 import abc
       3 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
       4     @abc.abstractmethod
       5     def talk(self):
       6         pass
       7 
       8 class People(Animal): #动物的形态之一:人
       9     def talk(self):
      10         print('say hello')
      11 
      12 class Dog(Animal): #动物的形态之二:狗
      13     def talk(self):
      14         print('say wangwang')
      15 
      16 class Pig(Animal): #动物的形态之三:猪
      17     def talk(self):
      18         print('say aoao')
      19 
      20 class Cat(Animal):
      21     def talk(self):
      22         print('say miamiao')
      23 
      24 #多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
      25 peo1=People()
      26 dog1=Dog()
      27 pig1=Pig()
      28 cat1=Cat()
      29 
      30 # peo1.talk()
      31 # dog1.talk()
      32 # pig1.talk()
      33 
      34 def func(animal):
      35     animal.talk()
      36 
      37 
      38 func(peo1)
      39 func(pig1)
      40 func(dog1)
      41 func(cat1)
      多态与多态性
        1 # class A:
        2 #     __x=1 #_A__x=1
        3 #
        4 #     def __init__(self,name):
        5 #         self.__name=name #self._A__name=name
        6 #
        7 #     def __foo(self): #def _A__foo(self):
        8 #         print('run foo')
        9 #
       10 #     def bar(self):
       11 #         self.__foo() #self._A__foo()
       12 #         print('from bar')
       13 
       14 # print(A.__dict__)
       15 # print(A.__x)
       16 # print(A.__foo)
       17 
       18 # a=A('egon')
       19 # a._A__foo()
       20 # a._A__x
       21 
       22 # print(a.__name) #a.__dict__['__name']
       23 # print(a.__dict__)
       24 
       25 # a.bar()
       26 
       27 '''
       28 这种变形的特点:
       29     1、在类外部无法直接obj.__AttrName
       30     2、在类内部是可以直接使用:obj.__AttrName
       31     3、子类无法覆盖父类__开头的属性
       32 '''
       33 
       34 # class Foo:
       35 #     def __func(self): #_Foo__func
       36 #         print('from foo')
       37 #
       38 #
       39 # class Bar(Foo):
       40 #     def __func(self): #_Bar__func
       41 #         print('from bar')
       42 
       43 # b=Bar()
       44 # b.func()
       45 
       46 
       47 
       48 # class B:
       49 #     __x=1
       50 #
       51 #     def __init__(self,name):
       52 #         self.__name=name #self._B__name=name
       53 
       54 
       55 #验证问题一:
       56 # print(B._B__x)
       57 
       58 #验证问题二:
       59 # B.__y=2
       60 # print(B.__dict__)
       61 # b=B('egon')
       62 # print(b.__dict__)
       63 #
       64 # b.__age=18
       65 # print(b.__dict__)
       66 # print(b.__age)
       67 
       68 
       69 #验证问题三:
       70 # class A:
       71 #     def foo(self):
       72 #         print('A.foo')
       73 #
       74 #     def bar(self):
       75 #         print('A.bar')
       76 #         self.foo() #b.foo()
       77 #
       78 # class B(A):
       79 #     def foo(self):
       80 #         print('B.foo')
       81 #
       82 # b=B()
       83 # b.bar()
       84 
       85 
       86 
       87 class A:
       88     def __foo(self): #_A__foo
       89         print('A.foo')
       90 
       91     def bar(self):
       92         print('A.bar')
       93         self.__foo() #self._A__foo()
       94 
       95 class B(A):
       96     def __foo(self): #_B__foo
       97         print('B.foo')
       98 
       99 b=B()
      100 b.bar()
      封装 1隐藏属性
       1 #一:封装数据属性:明确的区分内外,控制外部对隐藏的属性的操作行为
       2 # class People:
       3 #     def __init__(self,name,age):
       4 #         self.__name=name
       5 #         self.__age=age
       6 #
       7 #     def tell_info(self):
       8 #         print('Name:<%s> Age:<%s>' %(self.__name,self.__age))
       9 #
      10 #     def set_info(self,name,age):
      11 #         if not isinstance(name,str):
      12 #             print('名字必须是字符串类型')
      13 #             return
      14 #         if not isinstance(age,int):
      15 #             print('年龄必须是数字类型')
      16 #             return
      17 #         self.__name=name
      18 #         self.__age=age
      19 #
      20 # p=People('egon',18)
      21 #
      22 # # p.tell_info()
      23 #
      24 # # p.set_info('EGON',38)
      25 # # p.tell_info()
      26 #
      27 # # p.set_info(123,38)
      28 # p.set_info('egon','38')
      29 # p.tell_info()
      30 
      31 
      32 #二、 封装方法:隔离复杂度
      33 
      34 class ATM:
      35     def __card(self):
      36         print('插卡')
      37     def __auth(self):
      38         print('用户认证')
      39     def __input(self):
      40         print('输入取款金额')
      41     def __print_bill(self):
      42         print('打印账单')
      43     def __take_money(self):
      44         print('取款')
      45 
      46     def withdraw(self):
      47         self.__card()
      48         self.__auth()
      49         self.__input()
      50         self.__print_bill()
      51         self.__take_money()
      52 
      53 a=ATM()
      54 
      55 a.withdraw()
      56 
      57 示例二:
      58 class Room:
      59     def __init__(self,name,owner,weight,length,height):
      60         self.name=name
      61         self.owner=owner
      62 
      63         self.__weight=weight
      64         self.__length=length
      65         self.__height=height
      66 
      67     def tell_area(self):
      68         return self.__weight * self.__length * self.__height
      69 
      70 r=Room('卫生间','alex',10,10,10)
      71 
      72 # print(r.tell_area())
      73 
      74 print(r.tell_area())
      封装 示例


      类的使用(二)

       1 '''
       2 BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
       3 
       4 成人的BMI数值:
       5 
       6 过轻:低于18.5
       7 
       8 正常:18.5-23.9
       9 
      10 过重:24-27
      11 
      12 肥胖:28-32
      13 
      14 非常肥胖, 高于32
      15 
      16 体质指数(BMI)=体重(kg)÷身高^2(m)
      17 
      18 EX:70kg÷(1.75×1.75)=22.86
      19 '''
      20 # class People:
      21 #     def __init__(self,name,weight,height):
      22 #         self.name=name
      23 #         self.weight=weight
      24 #         self.height=height
      25 #
      26 #     @property
      27 #     def bmi(self):
      28 #         return self.weight / (self.height ** 2)
      29 #
      30 # p=People('egon',75,1.81)
      31 # # p.bmi=p.weight / (p.height ** 2)
      32 # # print(p.bmi)
      33 #
      34 # # print(p.bmi())
      35 # # print(p.bmi)
      36 #
      37 # # p.height=1.82
      38 # # print(p.bmi)
      39 #
      40 # p.bmi=3333 #报错AttributeError: can't set attribute
      41 
      42 
      43 
      44 
      45 class People:
      46     def __init__(self,name):
      47         self.__name=name
      48 
      49     @property
      50     def name(self):
      51         # print('getter')
      52         return self.__name
      53 
      54     @name.setter
      55     def name(self,val):
      56         # print('setter',val)
      57         if not isinstance(val,str):
      58             print('名字必须是字符串类型')
      59             return
      60         self.__name=val
      61 
      62     @name.deleter
      63     def name(self):
      64         print('deleter')
      65 
      66         print('不允许删除')
      67 
      68 
      69 p=People('egon')
      70 
      71 # print(p.get_name())
      72 
      73 # print(p.name)
      74 
      75 # p.name
      76 # p.name='EGON'
      77 # p.name=123
      78 # print(p.name)
      79 
      80 del p.name
      property
       1 '''
       2 在类内部定义的函数,分为两大类:
       3     一:绑定方法:绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入
       4         绑定到对象的方法:在类内定义的没有被任何装饰器修饰的
       5 
       6         绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法
       7 
       8     二:非绑定方法:没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用
       9         非绑定方法:不与类或者对象绑定
      10 
      11 
      12 
      13 '''
      14 
      15 class Foo:
      16     def __init__(self,name):
      17         self.name=name
      18 
      19     def tell(self):
      20         print('名字是%s' %self.name)
      21 
      22     @classmethod
      23     def func(cls): #cls=Foo
      24         print(cls)
      25 
      26     @staticmethod
      27     def func1(x,y):
      28         print(x+y)
      29 
      30 f=Foo('egon')
      31 
      32 # print(Foo.tell)
      33 # Foo.tell(f)
      34 # print(f.tell)
      35 
      36 # f.tell()
      37 
      38 # print(Foo.func)
      39 # Foo.func()
      40 
      41 # print(Foo.func1)
      42 # print(f.func1)
      43 
      44 Foo.func1(1,2)
      45 f.func1(1,3)
      46 
      47 
      48 
      49 应用
      50 import settings
      51 import hashlib
      52 import time
      53 
      54 class People:
      55     def __init__(self,name,age,sex):
      56         self.id=self.create_id()
      57         self.name=name
      58         self.age=age
      59         self.sex=sex
      60 
      61     def tell_info(self): #绑定到对象的方法
      62         print('Name:%s Age:%s Sex:%s' %(self.name,self.age,self.sex))
      63 
      64     @classmethod
      65     def from_conf(cls):
      66         obj=cls(
      67             settings.name,
      68             settings.age,
      69             settings.sex
      70         )
      71         return obj
      72 
      73     @staticmethod
      74     def create_id():
      75         m=hashlib.md5(str(time.time()).encode('utf-8'))
      76         return m.hexdigest()
      77 
      78 # p=People('egon',18,'male')
      79 
      80 #绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入
      81 # p.tell_info() #tell_info(p)
      82 
      83 #绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
      84 # p=People.from_conf() #from_conf(People)
      85 # p.tell_info()
      86 
      87 
      88 #非绑定方法,不与类或者对象绑定,谁都可以调用,没有自动传值一说
      89 p1=People('egon1',18,'male')
      90 p2=People('egon2',28,'male')
      91 p3=People('egon3',38,'male')
      92 
      93 print(p1.id)
      94 print(p2.id)
      95 print(p3.id)
      绑定方法
       1 #反射:通过字符串映射到对象的属性
       2 # class People:
       3 #     country='China'
       4 #
       5 #     def __init__(self,name,age):
       6 #         self.name=name
       7 #         self.age=age
       8 #
       9 #     def talk(self):
      10 #         print('%s is talking' %self.name)
      11 #
      12 #
      13 # obj=People('egon',18)
      14 
      15 # print(obj.name) #obj.__dict__['name']
      16 # print(obj.talk)
      17 
      18 
      19 # choice=input('>>: ') #choice='name'
      20 # print(obj.choice) #print(obj.'name')
      21 
      22 
      23 
      24 # print(hasattr(obj,'name')) #obj.name #obj.__dict__['name']
      25 # print(hasattr(obj,'talk')) #obj.talk
      26 
      27 
      28 # print(getattr(obj,'namexxx',None))
      29 # print(getattr(obj,'talk',None))
      30 
      31 # setattr(obj,'sex','male') #obj.sex='male'
      32 # print(obj.sex)
      33 
      34 
      35 # delattr(obj,'age') #del obj.age
      36 # print(obj.__dict__)
      37 
      38 
      39 # print(getattr(People,'country')) #People.country
      40 
      41 
      42 #反射的应用:
      43 
      44 class Service:
      45     def run(self):
      46         while True:
      47             inp=input('>>: ').strip() #cmd='get a.txt'
      48             cmds=inp.split() #cmds=['get','a.txt']
      49 
      50             # print(cmds)
      51             if hasattr(self,cmds[0]):
      52                 func=getattr(self,cmds[0])
      53                 func(cmds)
      54 
      55 
      56     def get(self,cmds):
      57         print('get.......',cmds)
      58 
      59 
      60     def put(self,cmds):
      61         print('put.......',cmds)
      62 
      63 
      64 
      65 obj=Service()
      66 obj.run()
      反射
       1 #item系列
       2 # class Foo: #Dict
       3 #     def __init__(self,name):
       4 #         self.name=name
       5 #
       6 #     def __getitem__(self, item): #item='namexxx'
       7 #         # print('getitem...')
       8 #         return self.__dict__.get(item)
       9 #
      10 #     def __setitem__(self, key, value):
      11 #         # print('setitem...')
      12 #         # print(key,value)
      13 #         self.__dict__[key]=value
      14 #
      15 #     def __delitem__(self, key):
      16 #         # print('delitem...')
      17 #         # print(key)
      18 #         del self.__dict__[key]
      19 #
      20 # obj=Foo('egon')
      21 # print(obj.__dict__)
      22 
      23 
      24 #查看属性:
      25 # obj.属性名
      26 # print(obj['namexxx']) #obj.name
      27 
      28 
      29 #设置属性:
      30 # obj.sex='male'
      31 # obj['sex']='male'
      32 
      33 # print(obj.__dict__)
      34 # print(obj.sex)
      35 
      36 
      37 #删除属性
      38 # del obj.name
      39 # del obj['name']
      40 #
      41 # print(obj.__dict__)
      42 
      43 
      44 
      45 
      46 
      47 #__str__方法:
      48 # d=dict({'name':'egon'})
      49 # print(isinstance(d,dict))
      50 # print(d)
      51 
      52 
      53 # class People:
      54 #     def __init__(self,name,age):
      55 #         self.name=name
      56 #         self.age=age
      57 #
      58 #     def __str__(self):
      59 #         # print('====>str')
      60 #         return '<name:%s,age:%s>' %(self.name,self.age)
      61 #
      62 # obj=People('egon',18)
      63 # print(obj) #res=obj.__str__()
      64 
      65 
      66 #__del__
      67 
      68 # f=open('settings.py')
      69 # f.read()
      70 # f.close() #回收操作系统的资源
      71 
      72 # print(f)
      73 # f.read()
      74 
      75 
      76 
      77 class Open:
      78     def __init__(self,filename):
      79         print('open file.......')
      80         self.filename=filename
      81 
      82     def __del__(self):
      83         print('回收操作系统资源:self.close()')
      84 
      85 f=Open('settings.py')
      86 # del f #f.__del__()
      87 print('----main------') #del f #f.__del__()
      双下划线方法
       1 #储备知识exec
       2 #参数1:字符串形式的命令
       3 #参数2:全局作用域(字典形式),如果不指定默认就使用globals()
       4 #参数3:局部作用域(字典形式),如果不指定默认就使用locals()
       5 
       6 # g={
       7 #     'x':1,
       8 #     'y':2
       9 # }
      10 #
      11 # l={}
      12 #
      13 # exec("""
      14 # global x,m
      15 # x=10
      16 # m=100
      17 #
      18 # z=3
      19 # """,g,l)
      20 
      21 # print(g)
      22 # print(l)
      23 
      24 
      25 #一切皆对象,对象可以怎么用?
      26 #1、都可以被引用,x=obj
      27 #2、都可以当作函数的参数传入
      28 #3、都可以当作函数的返回值
      29 #4、都可以当作容器类的元素,l=[func,time,obj,1]
      30 
      31 
      32 
      33 #类也是对象,Foo=type(....)
      34 # class Foo:
      35 #     pass
      36 #
      37 # obj=Foo()
      38 # print(type(obj))
      39 # print(type(Foo))
      40 #
      41 #
      42 # class Bar:
      43 #     pass
      44 #
      45 # print(type(Bar))
      46 
      47 #产生类的类称之为元类,默认所以用class定义的类,他们的元类是type
      48 
      49 #定义类的两种方式:
      50 #方式一:class
      51 class Chinese: #Chinese=type(...)
      52     country='China'
      53 
      54     def __init__(self,namem,age):
      55         self.name=namem
      56         self.age=age
      57 
      58     def talk(self):
      59         print('%s is talking' %self.name)
      60 
      61 # print(Chinese)
      62 obj=Chinese('egon',18)
      63 print(obj,obj.name,obj.age)
      64 #方式二:type
      65 
      66 #定义类的三要素:类名,类的基类们,类的名称空间
      67 class_name='Chinese'
      68 class_bases=(object,)
      69 
      70 class_body="""
      71 country='China'
      72 
      73 def __init__(self,namem,age):
      74     self.name=namem
      75     self.age=age
      76 
      77 def talk(self):
      78     print('%s is talking' %self.name)
      79 """
      80 
      81 class_dic={}
      82 exec(class_body,globals(),class_dic)
      83 # print(class_dic)
      84 
      85 Chinese1=type(class_name,class_bases,class_dic)
      86 # print(Chinese1)
      87 
      88 obj1=Chinese1('egon',18)
      89 print(obj1,obj1.name,obj1.age)
      元类介绍
       1 class Mymeta(type):
       2     def __init__(self,class_name,class_bases,class_dic):
       3         if not class_name.istitle():
       4             raise TypeError('类名的首字母必须大写')
       5 
       6         if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
       7             raise TypeError('必须有注释,且注释不能为空')
       8 
       9         super(Mymeta,self).__init__(class_name,class_bases,class_dic)
      10 
      11 class Chinese(object,metaclass=Mymeta):
      12     '''
      13     中文人的类
      14     '''
      15     country='China'
      16 
      17     def __init__(self,namem,age):
      18         self.name=namem
      19         self.age=age
      20 
      21     def talk(self):
      22         print('%s is talking' %self.name)
      23 
      24 
      25 # Chinese=Mymeta(class_name,class_bases,class_dic)
      自定义元类控制类的行为
       1 #知识储备__call__方法
       2 # class Foo:
       3 #     def __call__(self, *args, **kwargs):
       4 #         print(self)
       5 #         print(args)
       6 #         print(kwargs)
       7 #
       8 #
       9 # obj=Foo()
      10 #
      11 # obj(1,2,3,a=1,b=2,c=3) #obj.__call__(obj,1,2,3,a=1,b=2,c=3)
      12 #
      13 #
      14 # #元类内部也应有有一个__call__方法,会在调用Foo时触发执行
      15 # #Foo(1,2,x=1)  #Foo.__call__(Foo,1,2,x=1)
      16 
      17 
      18 
      19 
      20 class Mymeta(type):
      21     def __init__(self,class_name,class_bases,class_dic):
      22         if not class_name.istitle():
      23             raise TypeError('类名的首字母必须大写')
      24 
      25         if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
      26             raise TypeError('必须有注释,且注释不能为空')
      27 
      28         super(Mymeta,self).__init__(class_name,class_bases,class_dic)
      29 
      30     def __call__(self, *args, **kwargs): #obj=Chinese('egon',age=18)
      31         # print(self) #self=Chinese
      32         # print(args) #args=('egon',)
      33         # print(kwargs) #kwargs={'age': 18}
      34 
      35         #第一件事:先造一个空对象obj
      36         obj=object.__new__(self)
      37         #第二件事:初始化obj
      38         self.__init__(obj,*args,**kwargs)
      39         #第三件事:返回obj
      40         return obj
      41 
      42 class Chinese(object,metaclass=Mymeta):
      43     '''
      44     中文人的类
      45     '''
      46     country='China'
      47 
      48     def __init__(self,namem,age):
      49         self.name=namem
      50         self.age=age
      51 
      52     def talk(self):
      53         print('%s is talking' %self.name)
      54 
      55 
      56 
      57 
      58 obj=Chinese('egon',age=18) #Chinese.__call__(Chinese,'egon',18)
      59 
      60 print(obj.__dict__)
      自定义元类控制类的实例化行为
       1 #单例模式
       2 #实现方式一:
       3 # class MySQL:
       4 #     __instance=None #__instance=obj1
       5 #
       6 #     def __init__(self):
       7 #         self.host='127.0.0.1'
       8 #         self.port=3306
       9 #
      10 #     @classmethod
      11 #     def singleton(cls):
      12 #         if not cls.__instance:
      13 #             obj=cls()
      14 #             cls.__instance=obj
      15 #         return cls.__instance
      16 #
      17 #
      18 #     def conn(self):
      19 #         pass
      20 #
      21 #     def execute(self):
      22 #         pass
      23 #
      24 #
      25 # # obj1=MySQL()
      26 # # obj2=MySQL()
      27 # # obj3=MySQL()
      28 # #
      29 # # print(obj1)
      30 # # print(obj2)
      31 # # print(obj3)
      32 #
      33 # obj1=MySQL.singleton()
      34 # obj2=MySQL.singleton()
      35 # obj3=MySQL.singleton()
      36 #
      37 # print(obj1 is obj3)
      38 
      39 
      40 
      41 
      42 #实现方式二:元类的方式
      43 class Mymeta(type):
      44     def __init__(self,class_name,class_bases,class_dic):
      45         if not class_name.istitle():
      46             raise TypeError('类名的首字母必须大写')
      47 
      48         if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
      49             raise TypeError('必须有注释,且注释不能为空')
      50 
      51         super(Mymeta,self).__init__(class_name,class_bases,class_dic)
      52         self.__instance=None
      53 
      54     def __call__(self, *args, **kwargs): #obj=Chinese('egon',age=18)
      55         if not self.__instance:
      56             obj=object.__new__(self)
      57             self.__init__(obj)
      58             self.__instance=obj
      59 
      60         return self.__instance
      61 
      62 
      63 
      64 class Mysql(object,metaclass=Mymeta):
      65     '''
      66     mysql xxx
      67     '''
      68     def __init__(self):
      69         self.host='127.0.0.1'
      70         self.port=3306
      71 
      72     def conn(self):
      73         pass
      74 
      75     def execute(self):
      76         pass
      77 
      78 
      79 
      80 obj1=Mysql()
      81 obj2=Mysql()
      82 obj3=Mysql()
      83 
      84 print(obj1 is obj2 is obj3)
      应用
    3. 异常处理
       1 #1 什么是异常:异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那个就会抛出异常,并且程序的运行随之终止
       2 #
       3 # print('1')
       4 # print('2')
       5 # print('3')
       6 # int('aaaa')
       7 # print('4')
       8 # print('5')
       9 # print('6')
      10 
      11 #2 错误分为两种:
      12 #语法错误:在程序执行前就要立刻改正过来
      13 # print('xxxx'
      14 # if 1 > 2
      15 
      16 #逻辑错误
      17 
      18 #ValueError
      19 # int('aaa')
      20 
      21 #NameError
      22 # name
      23 
      24 #IndexError
      25 # l=[1,2,3]
      26 # l[1000]
      27 
      28 #KeyError
      29 # d={}
      30 # d['name']
      31 
      32 
      33 #AttributeError
      34 # class Foo:
      35 #     pass
      36 #
      37 # Foo.xxx
      38 
      39 
      40 #ZeroDivisionError:
      41 # 1/0
      42 
      43 
      44 #TypeError:int类型不可迭代
      45 # for i in 3:
      46 #     pass
      47 
      48 # import time
      49 # time.sleep(1000)
      50 
      51 
      52 
      53 #3 异常
      54 #强调一:错误发生的条件如果是可以预知的,此时应该用if判断去预防异常
      55 # AGE=10
      56 # age=input('>>: ').strip()
      57 #
      58 # if age.isdigit():
      59 #     age=int(age)
      60 #     if age > AGE:
      61 #         print('太大了')
      62 
      63 
      64 #强调二:错误发生的条件如果是不可预知的,此时应该用异常处理机制,try...except
      65 try:
      66     f=open('a.txt','r',encoding='utf-8')
      67 
      68     print(next(f),end='')
      69     print(next(f),end='')
      70     print(next(f),end='')
      71     print(next(f),end='')
      72 
      73     print(next(f),end='')
      74     print(next(f),end='')
      75     print(next(f),end='')
      76 
      77     f.close()
      78 except StopIteration:
      79     print('出错啦')
      80 
      81 
      82 print('====>1')
      83 print('====>2')
      84 print('====>3')
      异常处理
        1 #多分支:被监测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑
        2 # try:
        3 #     print('===>1')
        4 #     # name
        5 #     print('===>2')
        6 #     l=[1,2,3]
        7 #     # l[100]
        8 #     print('===>3')
        9 #     d={}
       10 #     d['name']
       11 #     print('===>4')
       12 #
       13 # except NameError as e:
       14 #     print('--->',e)
       15 #
       16 # except IndexError as e:
       17 #     print('--->',e)
       18 #
       19 # except KeyError as e:
       20 #     print('--->',e)
       21 #
       22 #
       23 # print('====>afer code')
       24 
       25 
       26 #万能异常:Exception,被监测的代码块抛出的异常有多种可能性,
       27 # 并且我们针对所有的异常类型都只用一种处理逻辑就可以了,那就使用Exception
       28 # try:
       29 #     print('===>1')
       30 #     # name
       31 #     print('===>2')
       32 #     l=[1,2,3]
       33 #     l[100]
       34 #     print('===>3')
       35 #     d={}
       36 #     d['name']
       37 #     print('===>4')
       38 #
       39 # except Exception as e:
       40 #     print('异常发生啦:',e)
       41 #
       42 # print('====>afer code')
       43 
       44 
       45 
       46 
       47 # try:
       48 #     print('===>1')
       49 #     # name
       50 #     print('===>2')
       51 #     l=[1,2,3]
       52 #     # l[100]
       53 #     print('===>3')
       54 #     d={}
       55 #     d['name']
       56 #     print('===>4')
       57 #
       58 # except NameError as e:
       59 #     print('--->',e)
       60 #
       61 # except IndexError as e:
       62 #     print('--->',e)
       63 #
       64 # except KeyError as e:
       65 #     print('--->',e)
       66 #
       67 # except Exception as e:
       68 #     print('统一的处理方法')
       69 #
       70 #
       71 # print('====>afer code')
       72 
       73 #其他结构
       74 # try:
       75 #     print('===>1')
       76 #     # name
       77 #     print('===>2')
       78 #     l=[1,2,3]
       79 #     # l[100]
       80 #     print('===>3')
       81 #     d={}
       82 #     d['name']
       83 #     print('===>4')
       84 #
       85 # except NameError as e:
       86 #     print('--->',e)
       87 #
       88 # except IndexError as e:
       89 #     print('--->',e)
       90 #
       91 # except KeyError as e:
       92 #     print('--->',e)
       93 #
       94 # except Exception as e:
       95 #     print('统一的处理方法')
       96 #
       97 # else:
       98 #     print('在被检测的代码块没有发生异常时执行')
       99 #
      100 # finally:
      101 #     print('不管被检测的代码块有无发生异常都会执行')
      102 #
      103 #
      104 #
      105 # print('====>afer code')
      106 
      107 
      108 # try:
      109 #     f=open('a.txt','r',encoding='utf-8')
      110 #     print(next(f))
      111 #     print(next(f))
      112 #     print(next(f))
      113 #     print(next(f))
      114 #
      115 #     print(next(f))
      116 #     print(next(f))
      117 # finally:
      118 #     f.close()
      119 
      120 
      121 #主动触发异常:raise  异常类型(值)
      122 # class People:
      123 #     def __init__(self,name,age):
      124 #         if not isinstance(name,str):
      125 #             raise TypeError('名字必须传入str类型')
      126 #         if not isinstance(age,int):
      127 #             raise TypeError('年龄必须传入int类型')
      128 #
      129 #         self.name=name
      130 #         self.age=age
      131 #
      132 # p=People('egon',18)
      133 
      134 
      135 #自定义异常类型
      136 class MyException(BaseException):
      137     def __init__(self,msg):
      138         super(MyException,self).__init__()
      139         self.msg=msg
      140 
      141     def __str__(self):
      142         return '<%s>' %self.msg
      143 
      144 raise MyException('我自己的异常类型') #print(obj)
      145 
      146 
      147 
      148 
      149 
      150 
      151 #断言assert
      152 
      153 # info={}
      154 # info['name']='egon'
      155 # # info['age']=18
      156 #
      157 #
      158 #
      159 #
      160 #
      161 #
      162 # # if 'name' not in info:
      163 # #     raise KeyError('必须有name这个key')
      164 # #
      165 # # if 'age' not in info:
      166 # #     raise KeyError('必须有age这个key')
      167 #
      168 # assert ('name' in info) and ('age' in info)
      169 #
      170 #
      171 #
      172 # if info['name'] == 'egon' and info['age'] > 10:
      173 #     print('welcome')
      174 
      175 
      176 
      177 
      178 try:
      179     pass
      180 
      181 
      182 except Exception:
      183     pass
      try..except 的详细用法
    作者:华王 博客:https://www.cnblogs.com/huahuawang/
  • 相关阅读:
    DRF的Filter:字段过滤,查找,排序
    DRF的ViewSet和Router
    DRF的APIView和mixins+GenericAPIView和ListAPIView
    DRF的Serializer和ModelSerializer
    html5中的drag
    excel与json转换
    call和bind的原生实现
    将字符串转化为条形码,在将canvas转化为图片
    JSON与excel之间的相互转化(Vue)
    js实现点击复制,将内容复制至剪贴板
  • 原文地址:https://www.cnblogs.com/huahuawang/p/14724663.html
Copyright © 2020-2023  润新知