Python-面向对像及其他

其他相关

1、isinstance(obj,cls)

      检查是否obj是类cls的对象

# 针对变量 n = 123

s 

= "123" print isinstance(n,int) # True print isinstance(s,int) # False print isinstance(s,str) # False

#

针对类 class Foo: pass

obj 

= Foo() print isinstance(obj,Foo) # True

2、issubclass(sub,super)

      检查sub类是否是super类的派生类

class

Foo: pass class Fun(Foo): pass print issubclass(Fun,Foo) # True

3、异常处理

1:模式: 
try
正常的代码 
    
pass 
except 
Exception,e: 
    异常后显示的内容 
    
pass

e是包含在Exception类中的一个对象,其中包含所有的报错的情况

实例:

while

True: num1 = raw_input(‘num1:‘) num2 = raw_input(‘num2:‘) try: num1 = int(num1) num2 = int(num2) result = num1 +num2 except Exception,e: print "报错信息如下显示:" print e ‘‘‘

打印结果:
num1:3
num2:f
报错信息如下显示:
invalid literal for int() with base 10: ‘f‘
‘‘‘

如果对程序的要求没有特殊的异常处理可以直接使用总的Exception,如果单独处理某种错误,可以按照下面的方法操作

try

:
li = [11,22,33,44]
li[110]
except IndexError,e:
print e

这样就只对索引的错误进行异常处理。

2:异常的种类

异常的种类有很多,每个异常专门用于处理某一项异常。


1

2

3

4

5

6

7

8

9

10

11

12

13

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

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

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

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

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

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

KeyboardInterrupt Ctrl+C被按下

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

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

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

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,

导致你以为正在访问它

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

异常其他结构

try

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

pass

主动触发异常

try:
    N = raw_input("请输入1:")
    if N == 1:
        print "成功"
    else:
         raise Exception(‘我这里出错了。。。‘)
except Exception,e:
    print "显示错误页面。。。。"
    print e

打印结果:
请输入1:2
显示错误页面。。。。
我这里出错了。。。

自定义触发异常


1

2

3

4

5

6

7

8

9

10

11

12

13

class Alexerror(Exception):

    def __init__(self,msg=None):

        self.message = msg

    def __str__(self):

        if self.message:

            return self.message

        else:

            return ‘Alex Error‘

try:

    #raise Alexerror(‘报错了报错了‘)

    raise Alexerror()

except Exception,e:

    print e

当类Alexerror加上括号执行的时候,是执行类中的构造函数__init__

Exception函数在返回的时候,是将__str__中的字符串返回出来。

如果使用Alexerror来执行的话,就返回Alex Error,在括号中加入内容的话,就返回其中的内容。

4、反射

普通方式实现:

首先在主程序中实现:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import home

print "oldboy 框架"

url = raw_input("请输入URL:")

if url == "home/func1":

    ret = home.func1()

    print ret

elif url == "home/func1":

    ret = home.func1()

    print ret

elif url == "home/func1":

    ret = home.func1()

    print ret

elif url == "home/func1":

    ret = home.func1()

    print ret

else:

    print "页面404错误"

调用的页面程序


1

2

3

4

5

6

7

8

9

10

#!/usr/bin/env python

# coding:utf-8

def func1():

    return "result func1"

def func2():

    return "result func2"

def func3():

    return "result func3"

def func4():

    return "result func4"

实现结果


1

2

3

4

5

6

oldboy 框架

请输入URL:rtew

页面404错误

oldboy 框架

请输入URL:home/func1

result func1

部分反射


1

2

3

4

5

6

7

8

9

10

11

12

import home

print "oldboy 框架"

url = raw_input("请输入URL:")

controller,action = url.split(‘/‘)

func = getattr(home,action)

ret = func()

print ret

打印结果:

oldboy 框架

请输入URL:home/func1

result func1

action = 字符串

getattr:去某个容器模块中找函数,字符串函数名,如果有则获取函数。

以字符串的形式执行某一个模块中的函数

反射功能由以下四个内置函数提供:

hasattr  getattr  setattr   delattr  这四个函数分别用于对对象内部执行:检查是否含有某个成员、获取成员、设置成员、删除成员。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

# 操作内存中某个容器中的元素

# getattr setattr delattr hasattr

# 找到home文件将内容加载到内存

import home

# 列出home中的所有内容

print dir(home)

print hasattr(home,‘func1‘)

print hasattr(home,‘2231241‘)

print getattr(home,‘func2‘)

setattr(home,‘alex‘,lambda x:x+1)

print dir(home)

delattr(home,‘func3‘)

print dir(home)

class foo:

    static_name = ‘cgt‘

    def __init__(self):

        self.name = ‘cgt‘

    def show(self):

        pass

    @staticmethod

    def static_show():

        pass

    @classmethod

    def class_show(cls):

        pass

print foo.__dict__.keys()

print hasattr(foo,‘show‘)

obj = foo()

print obj.__dict__

# 查看对象obj中有没有name元素,

print hasattr(obj,‘name‘)

print hasattr(obj,‘show‘)

打印结果:

[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘func1‘, ‘func2‘, ‘func3‘, ‘func4‘]

True

False

<function func2 at 0x021878F0>

[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘alex‘, ‘func1‘, ‘func2‘, ‘func3‘, ‘func4‘]

[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘alex‘, ‘func1‘, ‘func2‘, ‘func4‘]

[‘static_show‘, ‘__module__‘, ‘show‘, ‘static_name‘, ‘class_show‘, ‘__doc__‘, ‘__init__‘]

True

{‘name‘: ‘cgt‘}

True

True

设计模式

1、单例,顾名思义单个实例。

比如在游戏的场景中,就无法使用单例模式,要不你怎么创建那么多角色。

实际应用:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#!/usr/bin/env python

# coding:utf-8

class SqlHelper:

    __static_instance = None

    def __init__(self):

        pass

    @classmethod

    def instance(cls):

        if cls.__static_instance:

            return cls.__static_instance

        else:

            cls.__static_instance = SqlHelper()

            return cls.__static_instance

    def fetch(self):

        pass

    def remove(self):

        pass

def get_user():

    obj = SqlHelper.instance()

    obj.fetch()

    print id(obj)

    return ‘1‘

def del_user():

    obj = SqlHelper.instance()

    obj.remove()

    return ‘1‘

借助web来实现


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from wsgiref.simple_server import make_server

def RunServer(environ, start_response):

    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])

    url = environ[‘PATH_INFO‘]

    # 对URL以/进行分割,

    # http://localhost:8001/func3

    # temp = func3

    filename = url.split(‘/‘)[1]

    mothodname = url.split(‘/‘)[2]

    # import home

    module = __import__(filename)

    # 去home中检查,是否含有指定的函数

    is_exist = hasattr(module, mothodname)

    if is_exist:

        # 获取函数

        func = getattr(module, mothodname)

        # 执行t函数,并获取返回值

        ret = func()

        # 将函数返回值相应给请求者

        return ret

    else:

        return ‘404 not found‘

if __name__ == ‘__main__‘:

    httpd = make_server(‘‘, 8001, RunServer)

    print "Serving HTTP on port 8001..."

    httpd.serve_forever()

简单举例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class SqlHelper:

    __static_instance = None

    def __init__(self):

        self.hostname = ‘0.0.0.0‘

        self.port = 3306

    @classmethod

    def instance(cls):

        if cls.__static_instance:

            return cls.__static_instance

        else:

            cls.__static_instance = SqlHelper()

            return cls.__static_instance

obj1 = SqlHelper.instance()

print id(obj1)

obj2 = SqlHelper.instance()

print id(obj2)

时间: 2024-11-12 02:48:32

Python-面向对像及其他的相关文章

Python面向过程、模块的使用

一.Python面向过程 ''' 面向过程编程 核心过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.然后干什么... 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式 优点 复杂的问题流程化.进而简单化 缺点 扩展性极差 ''' # 将一个用户的注册功能拆成三个功能块,在利用函数的嵌套调用 # 接收用户输入用户名,进行用户名合法性校验,拿到合法的用户名 def check_user(): while True: name = input('username>>').s

Python面向切面编程-语法层面和functools模块

1,Python语法层面对面向切面编程的支持(方法名装饰后改变为log) __author__ = 'Administrator' import time def log(func): def wrapper(*args): start = time.time() func(args) end =time.time() print 'func used time is :', end - start return wrapper @log def reg(args): print 'welcom

Python 面向过程编程

一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优缺点 优点:程序体系结构清晰,可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件 应用场景:linux内核,git,httpd,shell脚本 三.实例(利用协程函数进行面向过程编程) 过滤一个文件下的子文件.字文件夹的内容中

python/面向过程的编程思想及举例

python基础--面向过程的编程思想及举例 面向过程的编程思想 1.面向过程的编程思想及举例 写程序时: 要先想功能,分步实现 2. os模块中walk输出目录中文件路径 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. Send可以传多个值,但是必须是元组类型 面向过程的编程思想 像流水线,代码简洁,体系结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

python面向过程与函数式编程

周六闲暇的午后,看到博客园众多大神的技术贴.作为一个什么都不懂的小学生,也开通了自己的博客,以后可以对外装×成伪大神了.第一篇记录下今天下午学的python基础: 1.面向过程编程:在python中,所说的过程其实和函数差别不大,也需要def进行定义,但是过程是没有返回值的. def guocheng(): print('我是过程') 上面定义的就是一个过程,没有返回值,只有函数内部的相关逻辑. 调用上面的过程:a=guocheng(),这样即可调用,如果在面板上打印a,会显示NONE,因为过程

Python面向过程编程

目录 面向过程编程 面向过程编程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响.与面向对象明显的不同就是封装.继承.类. 在python中就一句花,可以流水线的编程,调用返回值 面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想

Python面向过程和面向对象基础

总结一下: 面向过程编程:根据业务逻辑从上到下的写代码-----就是一个project写到底,重复利用性比较差 函数式:将某些特定功能代码封装到函数中------方便日后调用 面向对象:对函数进行分类封装,使开发更快捷更灵活 面向过程编程: 1 name = "mac" 2 age = 15 3 sex = 'male' 4 #...... 5 print("%s's %s,%d years old!" %(name,sex,age)) 函数式: 1 def nam

python 面向程序编程

类 __init__方法 对目标对象进行初始化操作,若该方法需要输入参数,在实例化是输入. 字段(类变量与实例变量) 类变量,即原型中的变量,通过原型引用:也可以通过self.__class__.引用.(类似与JS中原型的用法) 实例变量,即实例中添加/更改的变量,通过self引用. 若一个对象变量与一个类变量名称相同时,类变量将会被隐藏. 基类/超类:派生类/子类 疑惑点 所有的类成员都是公开的.但有一个例外:如果你使用数据成员并在其名字中使用双下划线 作为前缀,形成诸如 __privater

python面向对象小tips

(一).python鸭子类型 python作为动态语言继承和多态与静态语言(像java)有很大的不同:比如说在java中的某个方法,如果传入的参数是Animal类型,那么传入的对象必须是Animal类型或者其子类,否则,将无法调用run()方法.对于Python来说,则不一定需要传入Animal类型.我们只需要保证传入的对象有一个run()方法就可以了,这就是动态语言中的"鸭子类型",不强调严格的继承,只需要"看起来像鸭子就行了,即使你是一只天鹅", 所以说你的对象

python学习笔记12-python面向对象

python学习笔记12-python面向对象 python一切皆对象 一.基本概念 1.面向对象和面向过程 面向对象编程:C++,Java,Python 面向过程编程:函数式编程,C程序等 2.类和对象 类:是对事物的抽象,比如:人类,球类 对象:是类的一个实例,比如:足球,篮球,对象就是对类的实例化 属性:五官,眼,鼻子,理解为一个变量,静态属性 方法:对人来说,吃穿住行,理解为一个函数,动态方法 实例说明:球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球实体出来 3.为什么要使