zoukankan      html  css  js  c++  java
  • Python面向对象(一)

    面向对象

    面向过程:根据业务逻辑从上到下写垒代码  

    函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可  

    面向对象:对函数进行分类和封装,让开发“更快更好更强...”  

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用  

    类 是一个模板,模板中包装了多个“函数”供使用  

    对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 

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

    问题一:什么样的代码才是面向对象?答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。  

    问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?

    答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。  
    而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。  
    所以,一般在Python开发中,全部使用面向对象 面向对象和函数式混合使用  
    面向对象的应用场景:1.多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码  
              2.需要创建多个事物,每个事物属性个数相同,但是值的需求  
               如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同  

    问题三:类和对象在内存中是如何保存?

    答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:

    面向对象技术简介

      • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
      • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
      • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
      • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
      • 实例变量:定义在方法中的变量,只作用于当前实例的类。
      • 继承:即 一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是 模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
      • 实例化:创建一个类的实例,类的具体对象。
      • 方法:类中定义的函数。
      • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
      • 类定义

        语法格式如下
    class ClassName(object):
        """docstring for ClassName"""
        def __init__(self, arg):
            super(ClassName, self).__init__()
            self.arg = arg

    类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
    类中定义的函数叫做 “方法”

    面向对象三大特性:

      一、封装

    很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法(构造方法),像下面这样:

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

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

     

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

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

    • 通过对象直接调用
    • 通过self间接调用

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

    上图展示了对象 obj1 和 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属性

    2.通过self间接调用被封装的内容

    执行类中的方法时,需要通过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  

    案例:

    练习一:在终端输出如下信息  
      
        小明,10岁,男,上山去砍柴  
        小明,10岁,男,开车去东北  
        小明,10岁,男,最爱大保健  
        老李,90岁,男,上山去砍柴  
        老李,90岁,男,开车去东北  
        老李,90岁,男,最爱大保健  
    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()  
    View Code

    类的方法:

    #!/usr/bin/python3  
      
    #类定义  
    class people:  
        #定义基本属性  
        name = ''  
        age = 0  
        #定义私有属性,私有属性在类外部无法直接进行访问  
        __weight = 0  
        #定义构造方法  
        def __init__(self,n,a,w):  
            self.name = n  
            self.age = a  
            self.__weight = w  
        def speak(self):  
            print("%s 说: 我 %d 岁。" %(self.name,self.age))  
      
    # 实例化类  
    p = people('runoob',10,30)  
    p.speak()
    View Code

    二、继承

    动物:吃、喝、拉、撒

         猫:喵喵叫(猫继承动物的功能)

         狗:汪汪叫(狗继承动物的功能)

    伪代码:

    class 动物:
    
        def 吃(self):
            # do something
    
        def 喝(self):
            # do something
    
        def 拉(self):
            # do something
    
        def 撒(self):
            # do something
    
    # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
    class 猫(动物):
    
        def 喵喵叫(self):
            print '喵喵叫'
            
    # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
    class 狗(动物):
        def 汪汪叫(self):
            print '喵喵叫'

    实例:

    #!/usr/bin/python3  
      
    #类定义  
    class people:  
        #定义基本属性  
        name = ''  
        age = 0  
        #定义私有属性,私有属性在类外部无法直接进行访问  
        __weight = 0  
        #定义构造方法  
        def __init__(self,n,a,w):  
            self.name = n  
            self.age = a  
            self.__weight = w  
        def speak(self):  
            print("%s 说: 我 %d 岁。" %(self.name,self.age))  
      
    #单继承示例  
    class student(people):  
        grade = ''  
        def __init__(self,n,a,w,g):  
            #调用父类的构函  
            people.__init__(self,n,a,w)  
            self.grade = g  
        #覆写父类的方法  
        def speak(self):  
            print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

    s = student('ken',10,60,3)  

    s.speak()

    执行以上程序输出结果为:

    ken 说: 我 10 岁了,我在读 3 年级

    多继承

    python2.7多继承具体描述---戳这里@@@@@@@@@@@@@@@@@@@@@@@

    python3.0多继承是新式类

    而且还有一个特点:

    方法重写

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

    #!/usr/bin/python3
    
    class Parent:        # 定义父类
       def myMethod(self):
          print ('调用父类方法')
    
    class Child(Parent): # 定义子类
       def myMethod(self):
          print ('调用子类方法')
    
    c = Child()          # 子类实例
    c.myMethod()         # 子类调用重写方法

    执行以上程序输出结果为:

    调用子类方法

    三、多态 

     Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

  • 相关阅读:
    javascript定义函数后立即执行(IIFE)
    工作流选型专项,Camunda or flowable or?
    Excel中的xlsm宏密码怎么破解
    《生命是什么》总结
    《麦肯锡教我的思考武器》总结
    《作为意志和表象的世界》总结
    Go语言如何将json时间格式化为dateime格式
    《少有人走的路》总结
    《时间简史》总结
    架构的常规分类及复用重点
  • 原文地址:https://www.cnblogs.com/renfanzi/p/5645471.html
Copyright © 2011-2022 走看看