标签:
一、面向对象进阶
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:\Python35\python.exe H:/PyCharm/Python/PY_learn/lx3.pywangxiang | 
3.类的静态字段
| 1 2 3 4 5 6 7 8 9 | #!/bin/env python# -*- coding:utf-8 -*-classfoo:    country =‘中国‘# 静态字段(将每个对象中都重复的内容放在类中,保存一份)    def__init__(self, name):        self.name =name        # 普通字段    defshaw(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 -*-classfoo:    country =‘中国‘# 静态字段(将每个对象中都重复的内容放在类中,保存一份)    def__init__(self, name):        self.name =name        # 普通字段    @staticmethod    deftest(arg1,arg2):             # 静态方法,可以传递任意参数        print(‘test %s %s‘%(arg1,arg2))    defshaw(self):     # 普通方法        print(‘I am %s‘%name)foo.test(‘alices‘,‘sam‘)          # 通过类执行静态方法C:\Python35\python.exe H:/PyCharm/Python/PY_learn/lianxi.pytest alices sam | 
5.类方法
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/env python# -*- coding:utf-8 -*-classfoo:    country =‘中国‘# 静态字段(将每个对象中都重复的内容放在类中,保存一份)    def__init__(self, name):        self.name =name        # 普通字段    @classmethod# 类方法,其中cls参数代表当前类名(这个参数必须要有)    defacc(cls):        print(‘acc‘,cls)foo.acc()C:\Python35\python.exe H:/PyCharm/Python/PY_learn/lianxi.pyacc <class‘__main__.foo‘>                # cls即类名 | 
6.python 类特性
获取值
| 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 -*-classfoo:    def__init__(self,name):        self.name =name    defstart(self):        temp =‘%s sb‘%self.name        returntemp    @property# python特性,将方法伪造成一种字段(执行时,无需加括号)    defend(self):        temp =‘%s sb‘%self.name        returntempobj =foo(‘sam‘)ret =obj.start()val =obj.end               # 执行时,无需加括号(即不能加参数)print(ret)print(val)C:\Python35\python.exe H:/PyCharm/Python/PY_learn/lx3.pysam sbsam sb | 
设置数值:
    
7.面向对象小结:
面向对象三大特性:封装 ,继承,多态
面向对象成员:
字段:静态字段(每个对象都有一份),普通字段(每个对象都是不同的数据)
方法:静态方法(无需使用对象封装的内容),类方法(和静态方法相同,会自动添加类名),普通方法(使用对象中的数据)
特性:普通特性(将方法伪造成字段)
快速判断谁执行:
self ---> 对象调用
无self ---> 类调用
8.python成员修饰符
成员修饰符:公有和私有
私有内容,在类外部无法调用(包括其子类),只能在当前class内部调用
| 1 2 3 4 5 6 7 8 9 10 11 12 | classfoo:    va =‘vava‘    __vale =‘vale‘# 私有内容,在外部无法调用(包括子类),只能在当前class内部调用    def__init__(self,name):       self.__name =name    defstart(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 -*-classfoo:    va =‘vava‘    __vale =‘vale‘    def__init__(self):        pass    defstart(self):        print(foo.__vale)obj =foo()print(obj._foo__vale) | 
9.Python面向对象中特殊方法:
__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 | classfoo:    def__iter__(self):        yield1obj =foo()fori inobj:       # 如果执行for对象时,自动会执行对象的iter方法(生成器)print(i)C:\Python35\python.exe H:/PyCharm/Python/PY_learn/lx3.py1 | 
二、Python 异常
简单例子:(python2.7)
| 1 2 3 4 5 6 | try:    name =‘shaw‘    name_list =[‘shaw‘,‘sam‘,‘alex‘]    printname_list[4]exceptIndexError,ERROR:    printERROR      # 程序没有崩溃,还可以继续做其他事情 | 
常见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:    # 主代码块    passexceptkeyError as e:    # 出现异常时,执行该块    passelse:    # 主代码块执行完毕,执行该块    passfinally:    # 无论异常与否,最终执行该块    pass | 
自定义异常:
| 1 2 3 4 5 6 7 8 | try:    print(123)    raiseException(‘出错了...‘)   # 主动抛出自定义异常exceptException as e:print(e)C:\Python35\python.exe H:/PyCharm/Python/PY_learn/lx3.py123出错了.. | 
  
标签:
原文地址:http://www.cnblogs.com/opsedu/p/7cb745e1b9ba5d00b25fa48e7e0e15cb.html