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()
View Code

属性方法:

属性方法的作用就是通过@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
View Code

 

二、类的特殊方法

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__)

这个类是描述的人的
View Code

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'>
View Code

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()

创建对象触发
对象加括号执行
View Code

 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__)
View Code

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)
View Code

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__
View Code

 

三、反射

通过字符串映射或修改程序运行时的状态、属性、方法, 有以下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)
View Code

动态导入模块

#!/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
View Code

四、异常处理

我们经常在程序中可以看到我们的程序运行时有时候会报错,那么在我们的程序中一般有错误与异常。

错误:指的是语法错误。

异常:指语法上没有错误,但是在程序运行时可能出现的错误。在运行期间检测的错误称为异常。

你会发现如何程序发生异常,整个程序将被终止。发生异常的语句以下的代码将不被执行。而且程序挂掉了,那么我们需要做的是在程序发异常时,保证程序正常结束,而不是挂掉。

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    用户代码生成的警告
View Code
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

IOError 输入/输出异常;基本上是无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误(的子类) ;代码没有正确对齐

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

KeyboardInterrupt Ctrl+C被按下

NameError 尝试访问一个没有申明的变量

SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值的类型是正确的

复制代码
View Code

例如我们知道在运算中除数不能为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
View Code
try:
    c=10/0
    
except ZeroDivisionError as e:
    print(e)





division by zero
View Code

我们这样就能进行友好的提示而不是出现一堆错误的信息。

try:
    c=10/0
  #当发生异常时执行
except ZeroDivisionError as e:
    print(e)
else:
    #当不发生异常时执行
    print("正常执行")
View Code

当发生多个异常时如何处理

#!/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("正常执行")
View Code
#!/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("正常执行")
View Code

万能异常:

在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("正常执行")
View Code

使用了万能异常后,在他后面的异常将不在执行。

所以万能异常一般都是写在最后的位置。

  • 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("不论有没有异常都要执行")


正常执行
不论有没有异常都要执行
View Code
#!/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
这是自定义异常
进行收尾工作
View Code
#!/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
这不是我想要的数据
进行收尾工作
View Code

 

posted @ 2018-09-06 14:29  龙之殇--疯狂者  阅读(169)  评论(0编辑  收藏  举报