一、概述

  • 面向过程:根据业务逻辑从上到下,完成代码;
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可;
  • 面向对象:对函数进行分类和封装。

二、面向对象

1.类、对象、方法、实例                                                            

①.字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。

  • 普通字段属于对象,每个对象都要保存一份
  • 静态字段属于类,在内存中只保存一份
  • 应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
class Province:

    # 静态字段
country = '中国' def __init__(self, name): # 普通字段
self.name = name # 直接访问普通字段
obj = Province('河北省')
print obj.name # 直接访问静态字段
Province.country

字段的定义和使用

②.方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
  • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
  • 静态方法:由调用;无默认参数;
  • 相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份
  • 不同点:方法调用者不同、调用方法时自动传入的参数不同。          
class Foo:

    def __init__(self, name):
self.name = name def ord_func(self):
""" 定义普通方法,至少有一个self参数 """ # print self.name
print '普通方法' @classmethod
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """ print '类方法' @staticmethod
def static_func():
""" 定义静态方法 ,无默认参数""" print '静态方法' # 调用普通方法
f = Foo()
f.ord_func() # 调用类方法
Foo.class_func() # 调用静态方法
Foo.static_func()

方法的定义及使用

# 创建类
class Foo: def Bar(self):
print 'Bar' def Hello(self, name):
print 'i am %s' %name obj = Foo()  # 根据类Foo创建对象obj
obj.Bar()  # 执行Bar方法
obj.Hello('Bob')  # 执行Hello方法 

类、对象、方法创建实例

③.属性

Python中的属性其实是普通方法的变形。

(1)属性的定义及使用

# ############### 定义 ###############
class Foo: def func(self):
pass # 定义属性
@property
def prop(self):
pass
# ############### 调用 ###############
foo_obj = Foo() foo_obj.func()
foo_obj.prop #调用属性

属性的定义及使用

属性的定义和调用注意事项:

  • 定义时,在普通方法的基础上添加 @property 装饰器;
  • 定义时,属性仅有一个self参数
  • 调用时,无需括号
               方法:foo_obj.func()
               属性:foo_obj.prop

  注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象

属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。

实例:

对于主机列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,

所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据(即:limit m,n),这个分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n
  • 根据m 和 n 去数据库中请求数据
# ############### 定义 ###############
class Pager: def __init__(self, current_page):
# 用户当前请求的页码(第一页、第二页...)
self.current_page = current_page
# 每页默认显示10条数据
self.per_items = 10 @property
def start(self):
val = (self.current_page - 1) * self.per_items
return val @property
def end(self):
val = self.current_page * self.per_items
return val # ############### 调用 ############### p = Pager(1)
p.start 就是起始值,即:m
p.end 就是结束值,即:n

实例功能实现代码

Python的属性的功能是:属性内部进行一系列的逻辑计算,最终将计算结果返回。

(2)属性的两种定义方式

  • 装饰器 即:在方法上应用装饰器
  • # ############### 定义 ###############
    class Goods: @property
    def price(self):
    return "wupeiqi"
    # ############### 调用 ###############
    obj = Goods()
    result = obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

    经典类,具有一种@property装饰器

    # ############### 定义 ###############
    class Goods(object): @property
    def price(self):
    print '@property' @price.setter
    def price(self, value):
    print '@price.setter' @price.deleter
    def price(self):
    print '@price.deleter' # ############### 调用 ###############
    obj = Goods() obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数 del obj.price # 自动执行 @price.deleter 修饰的 price 方法

    新式类,具有三种@property装饰器

    新式类中具有三种访问方式,可分别将三个方法定义为对同一个属性:获取、修改、删除

  • class Goods(object):
    
        def __init__(self):
    # 原价
    self.original_price = 100
    # 折扣
    self.discount = 0.8 @property
    def price(self):
    # 实际价格 = 原价 * 折扣
    new_price = self.original_price * self.discount
    return new_price @price.setter
    def price(self, value):
    self.original_price = value @price.deltter
    def price(self, value):
    del self.original_price obj = Goods()
    obj.price # 获取商品价格
    obj.price = 200 # 修改商品原价
    del obj.price # 删除商品原价

    新式类访问:实例

  • 静态字段 即:在类中定义值为property对象的静态字段

     当使用静态字段的方式创建属性时,经典类和新式类无区别

class Foo:

    def get_bar(self):
return 'wupeiqi' BAR = property(get_bar) obj = Foo()
reuslt = obj.BAR # 自动调用get_bar方法,并获取方法的返回值
print reuslt

静态字段属性定义及使用

   property的构造方法中有个4个参数:

    • 第1个参数是方法名,调用 对象.属性 时自动触发执行方法
    • 第2个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
    • 第3个参数是方法名,调用 del 对象.属性 时自动触发执行方法
    • 第4个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
class Foo:

    def get_bar(self):
return 'wupeiqi' # *必须两个参数
def set_bar(self, value):
return return 'set value' + value def del_bar(self):
return 'wupeiqi' BAR = property(get_bar, set_bar, del_bar, 'description...') obj = Foo() obj.BAR # 自动调用第一个参数中定义的方法:get_bar
obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
del Foo.BAR # 自动调用第三个参数中定义的方法:del_bar方法
obj.BAE.__doc__ # 自动获取第四个参数中设置的值:description...

    静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

class Goods(object):

    def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8 def get_price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price def set_price(self, value):
self.original_price = value def del_price(self, value):
del self.original_price PRICE = property(get_price, set_price, del_price, '价格属性描述...') obj = Goods()
obj.PRICE # 获取商品价格
obj.PRICE = 200 # 修改商品原价
del obj.PRICE # 删除商品原价

2.类成员修饰符                                                              

对于每一个类的成员而言都有两种形式:

  • 公有成员,在任何地方都能访问
  • 私有成员,只有在类的内部才能方法
  • 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线。(特殊成员除外,例如:__init__、__call__、__dict__等)
class C:

    def __init__(self):
self.name = '公有字段'
self.__foo = "私有字段"

私有成员和公有成员的访问限制不同

静态字段

  • 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
class C:

    name = "公有静态字段"

    def func(self):
print C.name class D(C): def show(self):
print C.name C.name # 类访问 obj = C()
obj.func() # 类内部可以访问 obj_son = D()
obj_son.show() # 派生类中可以访问

公有静态字段

  • 私有静态字段:仅类内部可以访问;
class C:

    __name = "公有静态字段"

    def func(self):
print C.__name class D(C): def show(self):
print C.__name C.__name # 类访问 ==> 错误 obj = C()
obj.func() # 类内部可以访问 ==> 正确 obj_son = D()
obj_son.show() # 派生类中可以访问 ==> 错误

私有静态字段

普通字段

  • 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
class C:

    def __init__(self):
self.foo = "公有字段" def func(self):
print self.foo  # 类内部访问 class D(C): def show(self):
print self.foo # 派生类中访问 obj = C() obj.foo # 通过对象访问
obj.func() # 类内部访问 obj_son = D();
obj_son.show() # 派生类中访问

公有字段

  • 私有普通字段:仅类内部可以访问;
class C:

    def __init__(self):
self.__foo = "私有字段" def func(self):
print self.foo  # 类内部访问 class D(C): def show(self):
print self.foo # 派生类中访问 obj = C() obj.__foo # 通过对象访问 ==> 错误
obj.func() # 类内部访问 ==> 正确 obj_son = D();
obj_son.show() # 派生类中访问 ==> 错误

私有字段

方法、属性的访问于上述方式相似,即:私有成员只能在类内部使用

ps:非要访问私有属性的话,可以通过 对象._类__属性名

3.类的特殊成员                                                              

  • __doc__:表示类的描述信息
  • class Foo:
    """ 描述类信息,这是用于看片的神奇 """ def func(self):
    pass print Foo.__doc__
    #输出:类的描述信息
  • __module__:表示当前操作的对象在那个模块
  • __class__:表示当前操作的对象的类是什么
  • from lib.aa import C
    
    obj = C()
    print obj.__module__ # 输出 lib.aa,即:输出模块
    print obj.__class__ # 输出 lib.aa.C,即:输出类
  • __init__:构造方法,通过类创建对象时,自动触发执行
  • class Foo:
    
        def __init__(self, name):
    self.name = name
    self.age = 18 obj = Foo('wupeiqi') # 自动执行类中的 __init__ 方法
  • __del__:析构方法,当对象在内存中被释放时,自动触发执行
  • class Foo:
    
        def __del__(self):
    pass
  • __call__:对象后面加括号,触发执行
  • class Foo:
    
        def __init__(self):
    pass def __call__(self, *args, **kwargs): print '__call__' obj = Foo() # 执行 __init__
    obj() # 执行 __call__
  • __dict__:类或对象中的所有成员
  • class Province:
    
        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'}
  • __str__:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

  • class Foo:
    
        def __str__(self):
    return 'wupeiqi' obj = Foo()
    print obj
    # 输出:wupeiqi
  • __getitem__、__setitem__、__delitem__:用于索引操作,如字典。以上分别表示获取、设置、删除数据
  • #!/usr/bin/env python
    # -*- coding:utf-8 -*- 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'] = 'wupeiqi' # 自动触发执行 __setitem__
    del obj['k1'] # 自动触发执行 __delitem__
  • __getslice__、__setslice__、__delslice__:该三个方法用于分片操作,如:列表

  • #!/usr/bin/env python
    # -*- coding:utf-8 -*- class Foo(object): def __getslice__(self, i, j):
    print '__getslice__',i,j def __setslice__(self, i, j, sequence):
    print '__setslice__',i,j def __delslice__(self, i, j):
    print '__delslice__',i,j obj = Foo() obj[-1:1] # 自动触发执行 __getslice__
    obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__
    del obj[0:2] # 自动触发执行 __delslice__
  • __iter__:用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__

  • #!/usr/bin/env python
    # -*- coding:utf-8 -*- class Foo(object): def __init__(self, sq):
    self.sq = sq def __iter__(self):
    return iter(self.sq) obj = Foo([11,22,33,44]) for i in obj:
    print i
  • __new__ 和 __metaclass__
  • class MyType(type):
    
        def __init__(self, what, bases=None, dict=None):
    super(MyType, self).__init__(what, bases, dict) def __call__(self, *args, **kwargs):
    obj = self.__new__(self, *args, **kwargs) self.__init__(obj) class Foo(object): __metaclass__ = MyType def __init__(self, name):
    self.name = name def __new__(cls, *args, **kwargs):
    return object.__new__(cls, *args, **kwargs) # 第一阶段:解释器从上到下执行代码创建Foo类
    # 第二阶段:通过Foo类创建obj对象
    obj = Foo()

4.面向对象三大特性                                                            

面向对象的三大特性是指:封装、继承和多态

1)封装:

使用面向对象的封装特性时,需要:将内容封装到某处;从某处调用被封装的内容。

第①步:将内容封装到某处

self 是一个形式参数,当执行 obj1 = Foo('Bob', 18 ) 时,self 等于 obj1

  当执行 obj2 = Foo('Paul', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性。

第②步:从某处调用被封装的内容

  调用被封装的内容时,有两种情况:

  • 通过对象直接调用
class Foo:

    def __init__(self, name, age):
self.name = name
self.age = age obj1 = Foo('wupeiqi', 18)
print obj1.name # 直接调用obj1对象的name属性
print obj1.age # 直接调用obj1对象的age属性 obj2 = Foo('alex', 73)
print obj2.name # 直接调用obj2对象的name属性
print obj2.age # 直接调用obj2对象的age属性
  • 通过self间接调用
class Foo:

    def __init__(self, name, age):
self.name = name
self.age = age def detail(self):
print self.name
print self.age obj1 = Foo('wupeiqi', 18)
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),
          所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73)
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),
          所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

因此,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象中,然后通过对象直接或者self间接获取被封装的内容。

 2)继承

定义一个class类的时候,可从现有的class类中继承,新的class称为子类,而被继承的class称为基类、父类或超类

class Animal:

    def eat(self):
print "%s 吃 " %self.name def drink(self):
print "%s 喝 " %self.name def shit(self):
print "%s 拉 " %self.name def pee(self):
print "%s 撒 " %self.name class Cat(Animal): def __init__(self, name):
self.name = name
self.breed = '猫' def cry(self):
print '喵喵叫' class Dog(Animal): def __init__(self, name):
self.name = name
self.breed = '狗' def cry(self):
print '汪汪叫' # ######### 执行 ######### c1 = Cat('小白家的小黑猫')
c1.eat() c2 = Cat('小黑的小白猫')
c2.drink() d1 = Dog('胖子家的小瘦狗')
d1.eat()

继承实例

因此,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:子类又称为 派生类 ,父类又称为 基类 。

class D(object):

    def bar(self):
print 'D.bar' class C(D): def bar(self):
print 'C.bar' class B(D): def bar(self):
print 'B.bar' class A(B, C): def bar(self):
print 'A.bar' a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

多继承

3)多态

多态性:是允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象可以根据当前赋值给它的子对象的特性以不同的方式运作。即:允许将子类类型的指针赋值给父类类型的指针。
多态的作用:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用任一类的实例的某一属性时,可正确调用。
#_*_coding:utf-8_*_

class Animal(object):
def __init__(self, name): # Constructor of the class
self.name = name def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal):
def talk(self):
print('%s: 喵喵喵!' %self.name) class Dog(Animal):
def talk(self):
print('%s: 汪!汪!汪!' %self.name) def func(obj): #一个接口,多种形态
obj.talk() c1 = Cat('小晴')
d1 = Dog('李磊') func(c1)
func(d1)

多态实例

5.其他                                                                  

  • isinstance(obj, cls):检查是否obj是否是类 cls 的对象
  • class Foo(object):
    pass obj = Foo() isinstance(obj, Foo)
  • issubclass(sub, super):检查sub类是否是 super 类的派生类
  • class Foo(object):
    pass class Bar(Foo):
    pass issubclass(Bar, Foo)

三、异常处理

1.异常处理基础                                                              

try:
pass
except Exception,ex:
pass

2.常用异常处理                                                              

  • AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  • IOError 输入/输出异常;基本上是无法打开文件
  • ImportError 无法引入模块或包;基本上是路径问题或名称错误
  • IndentationError 语法错误(的子类) ;代码没有正确对齐
  • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  • KeyError 试图访问字典里不存在的键
  • KeyboardInterrupt Ctrl+C被按下
  • NameError 使用一个还未被赋予对象的变量
  • SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  • TypeError 传入对象类型与要求的不符合
  • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
  • ValueError 传入一个调用者不期望的值,即使值的类型是正确的
  • 更多异常:
  • ArithmeticError
    AssertionError
    AttributeError
    BaseException
    BufferError
    BytesWarning
    DeprecationWarning
    EnvironmentError
    EOFError
    Exception
    FloatingPointError
    FutureWarning
    GeneratorExit
    ImportError
    ImportWarning
    IndentationError
    IndexError
    IOError
    KeyboardInterrupt
    KeyError
    LookupError
    MemoryError
    NameError
    NotImplementedError
    OSError
    OverflowError
    PendingDeprecationWarning
    ReferenceError
    RuntimeError
    RuntimeWarning
    StandardError
    StopIteration
    SyntaxError
    SyntaxWarning
    SystemError
    SystemExit
    TabError
    TypeError
    UnboundLocalError
    UnicodeDecodeError
    UnicodeEncodeError
    UnicodeError
    UnicodeTranslateError
    UnicodeWarning
    UserWarning
    ValueError
    Warning
    ZeroDivisionError

异常类只能用来处理指定的异常情况,如果非指定异常则无法处理:

# 未捕获到异常,程序直接报错

s1 = 'hello'
try:
int(s1)
except IndexError,e:
print e

写程序时需要考虑到try代码块中可能出现的任意异常,可以这样写:

s1 = 'hello'
try:
int(s1)
except IndexError,e:
print e
except KeyError,e:
print e
except ValueError,e:
print e

万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:

s1 = 'hello'
try:
int(s1)
except Exception,e:
print e

并非有这个万能异常,其他异常均可忽略,对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行

s1 = 'hello'
try:
int(s1)
except KeyError,e:
print '键错误'
except IndexError,e:
print '索引错误'
except Exception, e:
print '错误'

3.其他异常处理结构                                                            

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

4.主动出发异常                                                              

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

5.自定义异常                                                               

class WupeiqiException(Exception):

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

6.断言                                                                  

# assert 条件

assert 1 == 1

assert 1 == 2

四、反射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,

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

class Foo(object):

    def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' obj = Foo() # #### 检查是否含有成员 ####
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')

反射应用实例

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server class Handler(object): def index(self):
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
ret = func()
return ret
else:
return '404 not found' if __name__ == '__main__':
httpd = make_server('', 8001, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()

web框架实例

#!/usr/bin/env python
# -*- coding:utf-8 -*- import sys def s1():
print 's1' def s2():
print 's2' this_module = sys.modules[__name__] hasattr(this_module, 's1')
getattr(this_module, 's2')

反射当前模块成员

结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象。

、练习

1.单例模式:创建三个游戏人物

   要求:

  • 小A,女,18,初始战斗力1000
  • 小B,男,20,初始战斗力1800
  • 小C,女,19,初始战斗力2500
# #####################  定义类  #####################
class Person: def __init__(self, na, gen, age, fig):
self.name = na
self.gender = gen
self.age = age
self.fight =fig def grassland(self):
"""注释:草丛战斗,消耗200战斗力""" self.fight = self.fight - 200 # ##################### 创建实例 ##################### cang = Person('小A', '女', 18, 1000)
dong = Person('小B', '男', 20, 1800)
bo = Person('小C', '女', 19, 2500)

2.单例模式:创建对数据库操作的公共类

# #### 定义类 ####

class DbHelper(object):

    def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def create(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
pass # #### 操作类 #### db = DbHelper()
db.create()

3.结合2,实现Web应用程序

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server class DbHelper(object): def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'fetch' def create(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'create' def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'remove' def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
return 'modify' class Handler(object): def index(self):
# 创建对象
db = DbHelper()
db.fetch()
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
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()

每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法

问题:

如果并发量大,内存里就会存在非常多功能上一模一样的对象。这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用

单例模式用来保证内存中仅存在一个实例

通过面向对象的特性,构造出单例模式:

# ########### 单例类定义 ###########
class Foo(object): __instance = None @staticmethod
def singleton():
if Foo.__instance:
return Foo.__instance
else:
Foo.__instance = Foo()
return Foo.__instance # ########### 获取实例 ###########
obj = Foo.singleton() Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton()
#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server # ########### 单例类定义 ###########
class DbHelper(object): __instance = None def __init__(self):
self.hostname = '1.1.1.1'
self.port = 3306
self.password = 'pwd'
self.username = 'root' @staticmethod
def singleton():
if DbHelper.__instance:
return DbHelper.__instance
else:
DbHelper.__instance = DbHelper()
return DbHelper.__instance def fetch(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def create(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def remove(self):
# 连接数据库
# 拼接sql语句
# 操作
pass def modify(self):
# 连接数据库
# 拼接sql语句
# 操作
pass class Handler(object): def index(self):
obj = DbHelper.singleton()
print id(single)
obj.create()
return 'index' def news(self):
return 'news' def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
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()

Web应用实例-单例模式

作业:开发一个支持多用户在线的FTP程序

要求:

  1. 用户加密认证
  2. 允许同时多用户登录
  3. 每个用户有自己的家目录 ,且只能访问自己的家目录
  4. 对用户进行磁盘配额,每个用户的可用空间不同
  5. 允许用户在ftp server上随意切换目录
  6. 允许用户查看当前目录下文件
  7. 允许上传和下载文件,保证文件一致性
  8. 文件传输过程中显示进度条
  9. 附加功能:支持文件的断点续传

http://www.cnblogs.com/wupeiqi/articles/5017742.html

Python开发【面向对象编程】的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  3. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  4. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  5. PYTHON开发--面向对象基础入门

    面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...

  6. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

  7. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  8. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  9. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  10. 一文看懂Python的面向对象编程

    之前在网络上看了很多关于面向对象的编程详解,还是不够过瘾,所以决定自己动手写一篇. 面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计. 类(Class) ...

随机推荐

  1. C++ 线程同步的四种方式

    程之间通信的两个基本问题是互斥和同步. (1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. (2)线程互 ...

  2. java匹配http或https的url的正则表达式20180912

    package org.jimmy.autosearch20180821.test; import java.util.regex.Matcher; import java.util.regex.Pa ...

  3. kafka可视化客户端工具(Kafka Tool)安装

    参考:https://www.cnblogs.com/frankdeng/p/9452982.html

  4. 【Hadoop】一、分布式数据库HBase简介

    1.分布式数据库特点   说到数据库,我们最熟悉的是类似于mysql这样的关系型数据库,称为RDBMS.关系型数据库作为一种数据存储和数据检索的关键技术,它支持SQL语言的结构化查询,但是它天生不是为 ...

  5. popToViewController

    看到群里有人问popToViewController的用法 就写了下了 希望能帮到有需要的人 [self.navigationController popToViewController:[self. ...

  6. 制作framework&静态库

    http://blog.csdn.net/justinjing0612/article/details/7880712     (制作framework) http://blog.sina.com.c ...

  7. 关于OpenMP的归约操作reduction

    这里提一个重要的点 像这样 ; void ff() { sum += 0.5; } //main() #pragma omp parallel for reduction(+:sum) ; i < ...

  8. 开发基本的php框架

    github路径:https://github.com/zhengchuzhou/easyPhpFramework 一.目录结构及用途 二.相关代码: 1.入口文件(index.php): <? ...

  9. asp.net:Parser Error & HTTP 错误 500.21 - Internal Server Error

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABEcAAAF8CAIAAACiwUIQAAAgAElEQVR4nO2dyZHzOpZGaVEaADNkBB ...

  10. leetcode-832翻转图像

    翻转图像 思路: 先对图像进行水平翻转,然后反转图片(对每个像素进行异或操作) 代码: class Solution: def flipAndInvertImage(self, A: List[Lis ...