• Python 面向对象(初级篇)


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

    一、封装

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

    _init_就是构造方法,根据类创建方法自动执行

    self 是一个形式参数

    当执行 obj1 = Foo(‘wupeiqi’, 18 ) 时,self 等于 obj1

    当执行 obj2 = Foo(‘alex’, 78 ) 时,self 等于 obj2

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

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

    通过对象直接调用

    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
     
    class Foo:
     
        def __init__(self, name, age ,gender):
            self.name = name
            self.age = age
            self.gender = gender
     
        def kanchai(self):
            print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)
     
        def qudongbei(self):
            print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)
     
        def dabaojian(self):
            print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)
     
    xiaoming = Foo('小明', 10, '男')
    xiaoming.kanchai()
    xiaoming.qudongbei()
    xiaoming.dabaojian()
     
    laoli = Foo('老李', 90, '男')
    laoli.kanchai()
    laoli.qudongbei()
    laoli.dabaojian()
     

    二、继承

     

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

     

    注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

    Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

    • 当类是经典类时,多继承情况下,会按照深度优先方式查找 
    • 当类是新式类时,多继承情况下,会按照广度优先方式查找

     当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

    三、多态

    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
    class F1:
        pass
     
    class S1(F1):
     
        def show(self):
            print 'S1.show'
     
    class S2(F1):
     
        def show(self):
            print 'S2.show'
     
    # 由于在Java或C#中定义函数参数时,必须指定参数的类型
    # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
    # 而实际传入的参数是:S1对象和S2对象
     
    def Func(F1 obj):
        """Func函数需要接收一个F1类型或者F1子类的类型"""
     
        print obj.show()
     
    s1_obj = S1()
    Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
     
    s2_obj = S2()
    Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.

    一、字段

    • 普通字段属于对象
      • 静态字段属于
      • 由上图可是:

        • 静态字段在内存中只保存一份
        • 普通字段在每个对象中都要保存一份
      • 普通方法:由对象调用;至少一个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
    # ############### 定义 ###############
    class Foo:
    
        def func(self):
            pass
    
        # 定义属性
        @property
        def prop(self):
            pass
    # ############### 调用 ###############
    foo_obj = Foo()
    
    foo_obj.func()
    foo_obj.prop   #调用属性
    复制代码
    复制代码
    class Province:
    
        # 静态字段
        country = '中国'
    
        def __init__(self, name):
    
            # 普通字段
            self.name = name
    
    
    # 直接访问普通字段
    obj = Province('河北省')
    print obj.name
    
    # 直接访问静态字段
    Province.country
  • 相关阅读:
    <排序算法> 计数排序CountSort
    <排序算法> 直接插入排序InsertSort
    <排序算法> 快速排序QuickSort
    C# 获取文件的后缀,文件名和路径
    C# 移除HTML标签
    无限层级数
    iOS通用链接配置
    iOS 最新证书制作流程、制作通用证书
    C# FormData 文件太大报错404 Form表单上传大文件,无法进入后台Action,页面提示404.
    IS加载JSON 和 MP4文件 错误 404 提示 需要添加mime映射(默认IIS Express里没有映射)
  • 原文地址:https://www.cnblogs.com/stonerainjc/p/6821446.html
Copyright © 2020-2023  润新知