• 类的特殊成员&反射&异常处理


    类的特殊成员

    1.__doc__表示类的描述信息

    class Foo(object):
        """ 描述类信息,这是用于看片的神奇 """
     
        def func(self):
            pass
     
    print(Foo.__doc__)
    #输出:描述类信息,这是用于看片的神奇
    

    2.__module__和 class

    module 表示当前操作的对象在那个模块

    class 表示当前操作的对象的类是什么

    class C():
    
        def __init__(self):
            self.name = 'wupeiqi'
    
    from lib.aa import C
    
    obj = C()
    print(obj.__module__)  # 输出lib.aa,即:输出模块
    
    print(obj.__class__)      # 输出 lib.aa.C,即:输出类
    

    3.__init__构造方法,通过类创建对象时,自动触发执行

    4.del

    析构方法,当对象在内存中被释放时,自动触发执行

    5.call

    对象后面加括号,触发执行。

    class Foo(object):
        def __init__(self):
            print("i am init")
        def __call__(self, *args, **kwargs):
            print("i am call")
    obj=Foo()  #执行__init__
    obj()      #执行__call__
    #输出:i am call
    
    

    6.dict 查看类或对象中的所有成员

    class Province(object):
        country = 'China'
        def __init__(self, name, count):
            self.name = name
            self.count = count
    
        def func(self, *args, **kwargs):
            print('func')
    
    # 获取类的成员,即:静态字段、方法、
    print(Province.__dict__)
    #打印类里的所有属性,不包括实例属性
    
    # 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}
    
    obj1 = Province('HeBei', 10000)
    print(obj1.__dict__)
    #打印实例属性
    # 获取 对象obj1 的成员
    # 输出:{'count': 10000, 'name': 'HeBei'}
    
    obj2 = Province('HeNan', 3888)
    print(obj2.__dict__)
    # 获取 对象obj1 的成员
    # 输出:{'count': 3888, 'name': 'HeNan'}
    

    7.str 当需要转化为字符串时执行该函数

    如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值。

    class Foo:
     
        def __str__(self):
            return 'alex li'
     
     
    obj = Foo()
    print(obj)
    # 输出:alex li
    

    8.getitemsetitemdelitem

    用于索引操作,如字典。以上分别表示获取、设置、删除数据

    class Foo(object):
     
        def __getitem__(self, key):
            print('__getitem__',key)
     
        def __setitem__(self, key, value):
            print('__setitem__',key,value)
     
        def __delitem__(self, key):
            print('__delitem__',key)
     
     
    obj = Foo()
     
    result = obj['k1']      # 自动触发执行 __getitem__
    obj['k2'] = 'alex'   # 自动触发执行 __setitem__
    del obj['k1']
    

    9__new__ metaclass

    类的生成 调用 顺序依次是 new --> init --> call

    详情参考alex博客

    http://www.cnblogs.com/alex3714/articles/5213184.html

    反射

    # #### 检查是否含有成员 ####
    hasattr(obj, 'name')
    hasattr(obj, 'func')
    
    # #### 获取成员 ####
    getattr(obj, 'name')
    getattr(obj, 'func')
    
    # #### 设置成员 ####
    setattr(obj, 'age', 18)
    setattr(obj, 'show', lambda num: num + 1)
    
    # #### 删除成员 ####
    # delattr(obj, 'name')
    # delattr(obj, 'func')
    print(getattr(obj,'age') )
    print(getattr(obj,'show')(123))
    

    异常处理

    1.异常结构

    try:
        # 主代码块
        pass
    except KeyError as e:
        # 异常时,执行该块
        pass
    else:
        # 主代码块执行完,执行该块
        pass
    finally:
        # 无论异常与否,最终执行该块
        pass
    

    2.主动触发异常

    try:
        raise Exception('错误了。。。')
    except Exception as e:
        print(e)
    

    3.自定义异常

    class WupeiqiException(Exception):
     
        def __init__(self, msg):
            self.message = msg
     
        def __str__(self):
            return self.message
     
    try:
        raise WupeiqiException('我的异常')
    except WupeiqiException as e:
        print(e)
    

    4.常用的异常

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    

    5.断言

    a=[1,2,3,4]
    assert type(a) is list
    print('list......')
    
  • 相关阅读:
    Ubuntu下基于u-boot搭建qemu的vexpress环境
    linux从head.s到start_kernelstart_kernel之---内核重定位后分析
    linux从head.s到start_kernelstart_kernel之---内核解压到重定位分析
    Jupyter Notebook介绍、安装及使用教程
    python基于SMTP发送邮件(qq邮箱)
    python正则表达式多次提取数据(一个规则提取多组数据)
    python正则表达式提取中文
    找到任务栏图标广告的源头
    1. Visio Web 形状
    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)
  • 原文地址:https://www.cnblogs.com/Jason-lin/p/7545933.html
Copyright © 2020-2023  润新知