zoukankan      html  css  js  c++  java
  • Python面向对象-基础篇(封装、继承、多态)

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)

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

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

    1、封装

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

    self 是一个形式参数:
    当执行obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1
    当执行obj2 = Foo('alex', 78 ) 时,self 等于 obj2
    所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存

    第二步:从某处调用被封装的内容(两种)

    1、通过对象直接调用被封装的内容

    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属性
    

     2、通过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、继承

    对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法
    注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已

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

    当类是经典类时,多继承情况下,会按照深度优先方式查找
    当类是新式类时,多继承情况下,会按照广度优先方式查找(准确的说是C3算法,非广度优先)

    方法重写:

    如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:

    此时对象调用的是子类方法

    3、多态

    Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”

    class F1:
        pass
    
    class S1(F1):
        def show(self):
            print 'S1.show'
    
    class S2(F1):
        def show(self):
            print 'S2.show'
    
    def Func(obj):
        print obj.show()
    
    s1_obj = S1()
    Func(s1_obj) 
    
    s2_obj = S2()
    Func(s2_obj) 
    
    Python “鸭子类型”
    

    面向对象的应用场景:
    1、多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码(这些字段可以定义未普通字段或私有字段)
    2、需要创建多个事物,每个事物属性个数相同,但是值的需求
    如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同

     
    类和对象在内存中是如何保存?
    答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份

     

  • 相关阅读:
    spark代码的提交
    单位局域网内的vmware的网络配置
    hive安装配置
    sparkshell中执行wordcount
    解决 在IDEA中使用Maven和Scala新建项目没有自动产生src 以及spark的编译运行配置
    IIS环境下MHT文件预览时弹出下载框的问题解决
    MySql解压版使用
    Oracle 11g OEM登录后提示“出现内部错误”
    如何杀掉(kill)Oracle中的会话(Session)
    IIS发布后出现“如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”错误
  • 原文地址:https://www.cnblogs.com/honey-badger/p/8963211.html
Copyright © 2011-2022 走看看