代码改变世界

2018.3.25学习笔记(成员修饰符、特殊成员、异常处理)

2018-03-25 18:30  冒牌权限  阅读(77)  评论(0)    收藏  举报

双下划线修饰符,只能内部访问,外部无法访问

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Provice:

    __fuck = 'fuck'#双下划线修饰静态字段

    @staticmethod
    def __test():#双下划线修饰静态方法
        print('fuck you,man!')

    def __init__(self,a1,a2):
        self.__a1 = a1#双下划线修饰普通字段
        self.a2 = a2

    def func(self):#内部访问被双下划线修饰的成员
        print(Provice.__fuck)
        print(self.__a1)
        Provice.__test()
        self.__func()

    def __func(self):#双下划线修饰普通方法
        print('__func')


obj =  Provice('f','k')
obj.func()#可以访问
print(obj.a2)
# print(obj.a1)#
# print(Provice.__fuck)
# Provice.__test()
# obj.__func()
#可以看到被双下划线修饰过的成员均无法外部访问

class cl(Provice):
    def func_cl(self):
        # print(self.__a1)#可以看到继承也无法访问
        self.func()#通过基类的方法才能访问

obj2 = cl('000',"111")
obj2.func_cl()

特殊成员__call__()

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class FC:

    def __init__(self):
        print('init')

    def __call__(self, *args, **kwargs):
        print('call')

FC()()#FC()实例化一个对象,输出init,对象后面加个(),则会执行该类的__call__()方法

特殊成员__getitem__()、__setitem__()、__delitem__()

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class FC:

    def __init__(self):
        print('init')

    def __getitem__(self,item):
        print(item)

    def __setitem__(self, key, value):
        print(key,value)

    def __delitem__(self, key):
        print(key)

ret = FC()
FC()[120]# FC()实例化一个对象,输出init,对象后面加个[],则会执行该类的__getitem__()方法
ret[120] = 1234567# 120赋值给key,1234567赋值给value
del ret[120]# 120赋值给key

特殊成员__dict__获取对象的成员

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class FC:

    def func(self):
        pass
#__dict__获取对象的成员
obj = FC()
print(obj.__dict__)
print(FC.__dict__)

特殊成员__iter__()

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class FC:

    def __iter__(self):
        yield '呵呵'
        yield '什么鬼'

obj = FC()
for i in obj:#本质上,for对象时,是去执行对象的__iter__()方法
    print(i)

异常处理

#!/usr/bin/env python
# -*- coding:utf-8 -*-

inp = input('请输入URL后半段:')
mods,funcs = inp.split('/')
try:#下列代码如果出错,则停止执行,跳转至except
    import_mods = __import__('test.' + mods,fromlist = True)
    if hasattr(import_mods,funcs):
        print(getattr(import_mods,funcs)())
    else:
        print('404')
except IndexError as error:#创建一个Exception类的对象error,IndexError捕获索引错误,如果没匹配则匹配下一个except
    print('索引错误')
except Exception as error:#创建一个Exception类的对象error,Exception可以捕获任何错误,还有很多可以用来捕获特定错误的
    print('无此模块')
    print(error)

一个完整的异常处理过程

#!/usr/bin/env python
# -*- coding:utf-8 -*-

try:
    pass
except IndexError as error:#如果try里边的代码块出错,跳转至这里,执行except里的代码块
    pass
except Exception as error:#如果上面的except没有匹配成功,则跳转至这里,执行except里的代码块
    pass
else:#如果try没有出错,则执行else里的代码块
    pass

finally:#这个可以单独拿出来看,无论try出错与否,执行完上面的except/else后都要来执行finally
    pass