zoukankan      html  css  js  c++  java
  • python面向对象

    面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象”
    的使用。

      

    • 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
    • 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

     类的成员可以分为三大类:字段、方法和属性 
     

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

    创建类
    class Foo:
         def __init__(self, name):
            # 普通字段
            self.name = name
         # 静态字段
        country = '中国'
        def Bar(self):
            print 'Bar'
     
        def Hello(self, name):
            print 'i am %s' %name
     
    # 根据类Foo创建对象obj
    obj = Foo()
    obj.Bar()            #执行Bar方法
    obj.Hello('wupeiqi') #执行Hello方法 
    

    二、方法

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

    • 普通方法:由对象调用;至少一个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()
    

    三、属性
    由属性的定义和调用要注意一下几点:

    定义时,在普通方法的基础上添加 @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的属性的功能是:属性内部进行一系列的逻辑计算,最终将计算结果返回。

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

    super在单继承中使用的例子:

    
    class Foo():
      def __init__(self, name)
        self.name = name
        
     
    class Bar(Foo):
      def __init__(self, name, age)
        super().__init__(name)
        self.age = age
    

    此例子适合python 3.x,如果要在python2.x下使用则需要稍作调整,如下代码示例:

    class Foo(object): 
      def __init__(self, name,age): 
        self.name = name
        self.age = age 
     
    class Bar(Foo): 
      def __init__(self, name, age): 
        super(Bar,self).__init__(name) 
        self.age = age
     
    
    

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
    那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

    Pyhon 很多语法都是支持多态的,比如 len(),sorted(), 你给len传字符串就返回字符串的长度,传列表就返回列表长度。

    #_*_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)
    
    
  • 相关阅读:
    set命令_Linux
    AngularJS的date 过滤器
    JMeter环境介绍
    JMeter测试计划要素
    HTTP协议的压缩及URL Encode
    fiddler配置及使用教程
    Slenium常用方法
    Selenium八大定位
    CSS实现上下左右垂直居中
    SASS用法笔记
  • 原文地址:https://www.cnblogs.com/flyhgx/p/6671217.html
Copyright © 2011-2022 走看看