zoukankan      html  css  js  c++  java
  • Python全栈开发day9

    一、面向对象进阶

      1.利用python反射查看面向对象成员

          对于对象:反射既可以找对象,类的成员

          对于类:反射只能找类中的成员

        

      2.利用反射操作模块(查找类,创建对象,查找对象中字段)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/env python
    # -*- coding:utf-8 -*-
    moudel = __import__('lianxi',fromlist=True) # 导入模块
    c_name = getattr(moudel,'foo')      # 到模块中查找类
    obj = c_name('wangxiang')       # 根据类创建对象
    val = getattr(obj,'name')       # 到对象中找字段的值
    print(val)
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lx3.py
    wangxiang

      3.类的静态字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/env python
    # -*- coding:utf-8 -*-
    class foo:
        country = '中国'          # 静态字段(将每个对象中都重复的内容放在类中,保存一份)
        def __init__(self, name):
            self.name = name        # 普通字段
     
        def shaw(self):     # 普通方法
            print('I am %s' % name)

      注意:

      类和对象都可以访问:静态字段,静态方法,普通字段,类方法,类的方法

          推荐:  

             1、谁的成员谁访问

                  类的成员,用类来访问

                  对象的成员,用对象来访问

                 除了类中的方法(不要用类去访问类中的方法)

             2.通过类访问:静态字段和静态方法,类方法。通过对象访问:普通字段,类的方法

      4、类的静态方法

        静态方法用类来访问

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/env python
    # -*- coding:utf-8 -*-
    class foo:
        country = '中国'          # 静态字段(将每个对象中都重复的内容放在类中,保存一份)
        def __init__(self, name):
            self.name = name        # 普通字段
     
        @staticmethod
        def test(arg1,arg2):             # 静态方法,可以传递任意参数
            print('test %s %s'%(arg1,arg2))
     
        def shaw(self):     # 普通方法
            print('I am %s' % name)
     
    foo.test('alices','sam')          # 通过类执行静态方法
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lianxi.py
    test alices sam

      5.类方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/env python
    # -*- coding:utf-8 -*-
    class foo:
        country = '中国'          # 静态字段(将每个对象中都重复的内容放在类中,保存一份)
        def __init__(self, name):
            self.name = name        # 普通字段
     
        @classmethod                    # 类方法,其中cls参数代表当前类名(这个参数必须要有)
        def acc(cls):
            print('acc',cls)
     
    foo.acc()
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lianxi.py
    acc <class '__main__.foo'>                # cls即类名

      6python 类特性

        获取值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/env python
    # -*- coding:utf-8 -*-
    class foo:
        def __init__(self,name):
            self.name = name
     
        def start(self):
            temp = '%s sb'% self.name
            return temp
     
        @property               # python特性,将方法伪造成一种字段(执行时,无需加括号)
        def end(self):
            temp = '%s sb'%self.name
            return temp
     
    obj = foo('sam')
    ret = obj.start()
    val = obj.end               # 执行时,无需加括号(即不能加参数)
    print(ret)
    print(val)
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lx3.py
    sam sb
    sam sb

        设置数值:

        

      7.面向对象小结:

          面向对象三大特性:封装 ,继承,多态

          面向对象成员:

             字段:静态字段(每个对象都有一份),普通字段(每个对象都是不同的数据)

             方法:静态方法(无需使用对象封装的内容),类方法(和静态方法相同,会自动添加类名),普通方法(使用对象中的数据)

             特性:普通特性(将方法伪造成字段

          快速判断谁执行:

             self ---> 对象调用

             无self ---> 类调用

      8python成员修饰符

          成员修饰符:公有和私有

          私有内容,在类外部无法调用(包括其子类),只能在当前class内部调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class foo:
        va = 'vava'
        __vale = 'vale'     # 私有内容,在外部无法调用(包括子类),只能在当前class内部调用
     
        def __init__(self,name):
           self.__name = name
     
        def start(self):
            print(foo.__vale)
     
    obj = foo(‘sam’)
    obj.start()

          Python外部访问私有内容(不推荐):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/env python
    # -*- coding:utf-8 -*-
    class foo:
        va = 'vava'
        __vale = 'vale'
     
        def __init__(self):
            pass
     
        def start(self):
            print(foo.__vale)
     
    obj = foo()
    print(obj._foo__vale)

      9Python面向对象中特殊方法:

          __init__      构造方法;封装普通字段

          __del__       析构方法;解释器销毁对象的时候,自动调用__del__

          __call__      如下图:    

        

          __getitem__

          __setitem__

          __delitem__

        

        上图中:

             ret[1:3] ---> 同样执行__getiteam__方法(类型为:slice

             ret[1:3] = [11,22,33] ---> 执行__setitem方法(类型为:slice)

          __dict__      查看对象中所有的字段(查看类中所有的成员)

          __iter__

    1
    2
    3
    4
    5
    6
    7
    8
    class foo:
        def __iter__(self):
            yield 1
    obj = foo()
    for i in obj:       # 如果执行for对象时,自动会执行对象的iter方法(生成器)
    print(i)
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lx3.py
    1

    二、Python 异常   

        简单例子:(python2.7

    1
    2
    3
    4
    5
    6
    try:
        name = 'shaw'
        name_list = ['shaw','sam','alex']
        print name_list[4]
    except IndexError,ERROR:
        print ERROR      # 程序没有崩溃,还可以继续做其他事情

       常见python 异常:

        AttributeError    试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

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

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

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

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

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

        KeyboardInterrupt   Ctrl+C被按下

        NameError            使用一个还未被赋予对象的变量

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

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

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

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

      完整异常结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try:
        # 主代码块
        pass
    except keyError as e:
        # 出现异常时,执行该块
        pass
    else:
        # 主代码块执行完毕,执行该块
        pass
    finally:
        # 无论异常与否,最终执行该块
        pass

      自定义异常:

    1
    2
    3
    4
    5
    6
    7
    8
    try:
        print(123)
        raise Exception('出错了...')   # 主动抛出自定义异常
    except Exception as e:
    print(e)
    C:Python35python.exe H:/PyCharm/Python/PY_learn/lx3.py
    123
    出错了..

      

  • 相关阅读:
    echart图表--雷达图表的动态数据max
    访问github个人博客时*.github.io 拒绝了我们的连接请求,错误码403
    js数组对象去重
    关于vuex的demo
    原生js实现 正方体旋转
    实现分页加载,加载更多(按钮类型),滚动加载的方式
    this指向
    记录三段式布局
    vue 动态路由 和 路由模式
    vue cli 配置反向代理
  • 原文地址:https://www.cnblogs.com/opsedu/p/7cb745e1b9ba5d00b25fa48e7e0e15cb.html
Copyright © 2011-2022 走看看