python day7
本节内容
面向对象:静态方法、类方法、属性方法
类的特殊方法
反射
异常处理
一、面向对象:静态方法、类方法、属性方法
静态方法:
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。
静态方法不能有参数 self
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 16:29 # software: PyCharm # 静态方法 class Dog(object): def __init__(self,name,age): self.name=name self.age=age pass @staticmethod #静态方法 def eat(): print("吃") pass pass dog = Dog('二哈',2) dog.eat() Dog.eat()
类方法:
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 16:29 # software: PyCharm # 静态方法 class Dog(object): type="狗" def __init__(self,name,age): self.name=name self.age=age pass #@staticmethod #静态方法 @classmethod #类方法 def eat(self): print("吃",self.type) pass pass dog = Dog('二哈',2) dog.eat() Dog.eat()
属性方法:
属性方法的作用就是通过@property把一个方法变成一个静态属性
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 16:40 # software: PyCharm class A(object): @property #属性方法:调用具有返回值的方法不用加括号了 把方法变成了属性 def getname(self): return "eat" pass @getname.setter #给属性方法传参 其实就是给属性赋值 def getname(self,name): self.__name=name print(self.__name) pass @getname.deleter def getname(self): del self.__name print("删除") pass a = A() a.getname="Drango war" print(a.getname) del a.getname
二、类的特殊方法
1. __doc__ 表示类的描述信息
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 17:20 # software: PyCharm class Person(object): '''这个类是描述的人的''' def sleep(self): '''这个方法是人的睡觉方法''' pass pass print(Person.__doc__) 这个类是描述的人的
2. __module__ 和 __class__
__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 17:24 # software: PyCharm from day7.demo9 import Person p= Person() print(p.__module__)#输出这个类属于哪个模块 print(p.__class__) #输出这个类 day7.demo9 <class 'day7.demo9.Person'>
3. __init__ 构造方法,通过类创建对象时,自动触发执行。
4.__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
5. __call__ 对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 17:20 # software: PyCharm class Person(object): '''这个类是描述的人的''' def sleep(self): '''这个方法是人的睡觉方法''' pass def __init__(self): print("创建对象触发") pass def __call__(self, *args, **kwargs): print("对象加括号执行") pass p= Person() p() 创建对象触发 对象加括号执行
6. __dict__ 查看类或对象中的所有成员
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 22:13 # software: PyCharm class Person(object): cn="中国" def __init__(self,name,age): self.name=name self.age=age pass pass p= Person('悟空',20) #获取对象成员 print(p.__dict__) #获取类的成员 print(Person.__dict__)
7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 22:13 # software: PyCharm class Person(object): cn="中国" def __init__(self,name,age): self.name=name self.age=age pass def __str__(self): return "人" pass p= Person('悟空',20) print(p)
8.__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 22:13 # software: PyCharm class Person(object): def __getitem__(self, key): print('__getitem__', key) pass def __setitem__(self, key, value): print('__setitem__', key, value) pass def __delitem__(self, key): print('__delitem__', key) pass pass p= Person() result=p['k1'] # 自动触发执行 __getitem__ p['k2']='Drango wal'# 自动触发执行 __setitem__ del p['k1']# 自动触发执行 __delitem__
三、反射
通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 23:25 # software: PyCharm class Person(object): def __init__(self,name): self.name=name pass def show(self): print('%s 是个兵') pass p = Person('Drango wal'); choose=input("请输入:") print(hasattr(p,choose)) #判断对象p中是否包含名为choose的特性 print(getattr(p,choose,'None'))#如果对象p中有属性choose则打印这个属性的值,或者对象中有choose这个方法,则打印这个方法的内存地址 setattr(p,choose,'悟空')#如果p对象中没有这个choose属性则添加一个choose属性,如果有则改变这个属性的值 print(getattr(p,choose)) delattr(p,choose)#删除模块中某个变量或者函数 print(p.choose)
动态导入模块
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/5 23:25 # software: PyCharm imp=input("输入模块名") dd=__import__(imp);#与import imp一样 # 执行这个模块中的函数 funname=input('输入函数名') fun=getattr(dd,funname,None) print(fun(3.2344)) 输入模块名math 输入函数名floor 3
四、异常处理
我们经常在程序中可以看到我们的程序运行时有时候会报错,那么在我们的程序中一般有错误与异常。
错误:指的是语法错误。
异常:指语法上没有错误,但是在程序运行时可能出现的错误。在运行期间检测的错误称为异常。
你会发现如何程序发生异常,整个程序将被终止。发生异常的语句以下的代码将不被执行。而且程序挂掉了,那么我们需要做的是在程序发异常时,保证程序正常结束,而不是挂掉。
python中的异常处理语法:
# 语法 try: # 可能发生异常的代码 except 异常类型 变量名: # 处理异常
在python中有很多的异常类型:
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError 所有数值计算错误的基类 FloatingPointError 浮点计算错误 OverflowError 数值运算超出最大限制 ZeroDivisionError 除(或取模)零 (所有数据类型) AssertionError 断言语句失败 AttributeError 对象没有这个属性 EOFError 没有内建输入,到达EOF 标记 EnvironmentError 操作系统错误的基类 IOError 输入/输出操作失败 OSError 操作系统错误 WindowsError 系统调用失败 ImportError 导入模块/对象失败 LookupError 无效数据查询的基类 IndexError 序列中没有此索引(index) KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命的) NameError 未声明/初始化对象 (没有属性) UnboundLocalError 访问未初始化的本地变量 ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象 RuntimeError 一般的运行时错误 NotImplementedError 尚未实现的方法 SyntaxError Python 语法错误 IndentationError 缩进错误 TabError Tab 和空格混用 SystemError 一般的解释器系统错误 TypeError 对类型无效的操作 ValueError 传入无效的参数 UnicodeError Unicode 相关的错误 UnicodeDecodeError Unicode 解码时的错误 UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning 关于被弃用的特征的警告 FutureWarning 关于构造将来语义会有改变的警告 OverflowWarning 旧的关于自动提升为长整型(long)的警告 PendingDeprecationWarning 关于特性将会被废弃的警告 RuntimeWarning 可疑的运行时行为(runtime behavior)的警告 SyntaxWarning 可疑的语法的警告 UserWarning 用户代码生成的警告
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 尝试访问一个没有申明的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 复制代码
例如我们知道在运算中除数不能为0
# 我们知道除数不能为0如果除数为0了程序就会发生异常 c=10/0 Traceback (most recent call last): File "F:/pythonDemo/day7/demo13.py", line 9, in <module> c=10/0 ZeroDivisionError: division by zero
try: c=10/0 except ZeroDivisionError as e: print(e) division by zero
我们这样就能进行友好的提示而不是出现一堆错误的信息。
try: c=10/0 #当发生异常时执行 except ZeroDivisionError as e: print(e) else: #当不发生异常时执行 print("正常执行")
当发生多个异常时如何处理
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 13:58 # software: PyCharm # 我们知道除数不能为0如果除数为0了程序就会发生异常 names=[] try: c=10/1 print(names[1]) #当发生异常时执行 except ZeroDivisionError as e: print(e) except IndexError as e: print(e) else: #当不发生异常时执行 print("正常执行")
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 13:58 # software: PyCharm # 我们知道除数不能为0如果除数为0了程序就会发生异常 names=[] try: c=10/1 print(names[1]) #当发生异常时执行 except (ZeroDivisionError,IndexError) as e: print(e) else: #当不发生异常时执行 print("正常执行")
万能异常:
在python的异常中,有一个万能异常:Exception,他可以捕获任意异常
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 13:58 # software: PyCharm # 我们知道除数不能为0如果除数为0了程序就会发生异常 names=[] try: c=10/1 print(names[1]) #当发生异常时执行 except Exception as e: print(e) else: #当不发生异常时执行 print("正常执行")
使用了万能异常后,在他后面的异常将不在执行。
所以万能异常一般都是写在最后的位置。
- try-finally 语句
try-finally 语句无论是否发生异常都将执行最后的代码。
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 13:58 # software: PyCharm # 我们知道除数不能为0如果除数为0了程序就会发生异常 names=[] try: c=10/1 #print(names[1]) #当发生异常时执行 except Exception as e: print(e) else: #当不发生异常时执行 print("正常执行") finally: print("不论有没有异常都要执行") 正常执行 不论有没有异常都要执行
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 14:20 # software: PyCharm class TypeError(Exception): def __str__(self): return "这是自定义异常" pass # 自定义异常需要自己触发异常 a=input("请输入:") try: if int(a)>10: raise TypeError() except TypeError as e: print(e) else: print(a) finally: print('进行收尾工作') 请输入:11 这是自定义异常 进行收尾工作
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:Dragon war # datetime:2018/9/6 14:26 # software: PyCharm # 自定义异常需要自己触发异常 a=input("请输入:") try: if int(a)>10: raise Exception("这不是我想要的数据") except Exception as e: print(e) else: print(a) finally: print('进行收尾工作') 请输入:11 这不是我想要的数据 进行收尾工作