一、面向对象进阶

  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.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:\Python35\python.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:\Python35\python.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:\Python35\python.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:\Python35\python.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:\Python35\python.exe H:/PyCharm/Python/PY_learn/lx3.py
123
出错了..

  

Python全栈开发day9的更多相关文章

  1. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  2. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  3. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  4. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  5. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  6. Python全栈开发【基础三】

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  7. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  8. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  9. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

随机推荐

  1. ruby中 Win32ole的各应用操作方法(word excel Outlook IE)

    Win32ole为标准Ruby发行版的一部分.Win32ole是访问Windows自动化的接口,可以让Ruby和Windows应用进行交互.具体说来Win32ole可以操作Word,Excel,IE, ...

  2. 解决YII提交POST表单出现400错误,以及ajax post请求时出现400问题

    POST表单400错误: 正确做法: Add this in the head section of your layout: <?= Html::csrfMetaTags() ?> -- ...

  3. json 与jsonp 特点及区别

    简单描述JSON跟JSONP的区别以及实战 什么是JSON? 前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点. JSON的优点 ...

  4. 黄聪:远程序桌面登录的.NET(C#)开发

    MSTSCLib.dll和MsTscAxWrapper.dll下载:LibDll.rar 远程序桌面登录的.NET开发,可以使用MSTSCLib.dll和MsTscAxWrapper.dll两个转换过 ...

  5. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  6. 源码阅读笔记 - 2 std::vector (1)

    vector的源码真是太长了,今天用了一个下午和一个晚上看和注释了前面的一千行左右 p.s.博客园的代码高亮真是太垃圾, 如果想要阅读带注释的源码,推荐粘贴到VS2015里,然后按ctrl+z取消自动 ...

  7. SpringMVC学习系列(11) 之 表单标签

    本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...

  8. 【webpy开发实战】webpy的cookbook 个人版

    版本:webpy0.3 问题1.1 所需软件及环境配置? 解决办法 sqlite: jinja2:找不到jinja2模块时,将jinja模块文件夹加入 sys.path  -> sys.path ...

  9. SQL调优常用方法

    在使用DBMS时经常对系统的性能有非常高的要求:不能占用过多的系统内存和 CPU资源.要尽可能快的完成的数据库操作.要有尽可能高的系统吞吐量.如果系统开发出来不能满足要求的所有性能指标,则必须对系统进 ...

  10. html css javascript 加载的顺序

    html /css /javascript 这三者的加载顺序影响整个页面的加载速度.而加载速度的快慢直接影响pv(访问量),而且会影响经济收入.在大网站中,可能打开速度快一秒,一年能多带来上亿的收入. ...