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

    一、面向对象和面向过程的区别
        
        1、面向对象:一切以对象为中心。有相同属性和动作的结合体叫做对
     
            优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
            缺点:性能比面向过程低
     
        2、面向过程:一切以实物的流程为中心
     
             优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
             缺点:没有面向对象易维护、易复用、易扩展
     
    二、面向对象的编写
    1 class Car:     #  class是关键字,表示类
    2     def __init__(self, color, pai, pailiang): # self表示当前类的对象. 当前你创建 的是谁, 谁来访问的这个方法.那这个self就是谁.
    3             self.color = color
    4             self.pai = pai        
    5             self.pailiang = pailiang
    6     def run(self, speed):
    7             print("车可以跑%s迈" % speed)
    8 c = Car("red", "京A66666", "2.0T")   # 创建对象,类名称后加括号即可,即为实例化
    9 c.run(100) # 这时. python会自动把对象c传递给run方法的第一个参数位置.

      1、面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
           类就是一个模板,模板里可以包含多个函数,函数里实现一些功能;对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
     
      2、类中的函数第一个参数必须是self(详细见:类的三大特性之封装);类中定义的函数叫做 “方法”
           实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
     1 class 类名:
     2     def __init__(self,参数1,参数2):
     3         self.对象的属性1 = 参数1
     4         self.对象的属性2 = 参数2
     5 
     6     def 方法名(self):pass
     7 
     8     def 方法名2(self):pass
     9 
    10 对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
    11                   #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
    12                   #括号里传参数,参数不需要传self,其他与init中的形参一一对应
    13                   #结果返回一个对象
    14 对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
    15 对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可
    三、面向对象的三大特征 -- 封装、继承和多态
     
        1、封装
     
        封装:  把很多数据封装到一个对象中.  把固定功能的代码封装到一个代码块, 函数, 对象,  打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了一个很牛B 的函数. 那这个也可以被称为封装.  在面向对象思        想中. 是把一些看似无关紧要的内容组合到一起统一进行行存储和使用. 这就是封装.
      2、继承
     
        (1) 单继承
        
        子类可以自动拥有父类中除了私有属性外的其他所有内容
    class DerivedClassName(BaseClassName1):
        <statement-1>
        . . .
        <statement-N>

    需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法

     1 #类定义
     2 class people:
     3     #定义基本属性
     4     name = ''
     5     age = 0
     6     #定义私有属性,私有属性在类外部无法直接进行访问
     7     __weight = 0
     8     #定义构造方法
     9     def __init__(self,n,a,w):
    10         self.name = n
    11         self.age = a
    12         self.__weight = w
    13     def speak(self):
    14         print("%s 说: 我 %d 岁。" %(self.name,self.age))
    15 #单继承示例
    16 class student(people):
    17     grade = ''
    18     def __init__(self,n,a,w,g):
    19         #调用父类的构函
    20         people.__init__(self,n,a,w)
    21         self.grade = g
    22     #覆写父类的方法
    23     def speak(self):
    24         print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
    25 
    26 s = student('ken',10,60,3)
    27 s.speak()
    28 结果:
    29 ken 说: 我 10 岁了,我在读 3 年级

    (2) 多继承

    class DerivedClassName(Base1, Base2, Base3):
        <statement-1>
         . . .
        <statement-N>

    需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。(MRO算法)

     1 #类定义
     2 class people:
     3     #定义基本属性
     4     name = ''
     5     age = 0
     6     #定义私有属性,私有属性在类外部无法直接进行访问
     7     __weight = 0
     8     #定义构造方法
     9     def __init__(self,n,a,w):
    10         self.name = n
    11         self.age = a
    12         self.__weight = w
    13     def speak(self):
    14         print("%s 说: 我 %d 岁。" %(self.name,self.age))
    15 #单继承示例
    16 class student(people):
    17     grade = ''
    18     def __init__(self,n,a,w,g):
    19         #调用父类的构函
    20         people.__init__(self,n,a,w)
    21         self.grade = g
    22     #覆写父类的方法
    23     def speak(self):
    24         print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
    25 #另一个类,多重继承之前的准备
    26 class speaker():
    27     topic = ''
    28     name = ''
    29     def __init__(self,n,t):
    30         self.name = n
    31         self.topic = t
    32     def speak(self):
    33         print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
    34 #多重继承
    35 class sample(speaker,student):
    36     a =''
    37     def __init__(self,n,a,w,g,t):
    38         student.__init__(self,n,a,w,g)
    39         speaker.__init__(self,n,t)
    40 test = sample("Tim",25,80,4,"Python")
    41 test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法
    42 结果:
    43 我叫 Tim,我是一个演说家,我演讲的主题是 Python
        (3) 方法重写
     
        如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
    1 class Parent:        # 定义父类
    2    def myMethod(self):
    3       print ('调用父类方法')
    4 class Child(Parent): # 定义子类
    5    def myMethod(self):
    6       print ('调用子类方法')
    7 c = Child()          # 子类实例
    8 c.myMethod()         # 子类调用重写方法
    9 super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
    3、多态
     
    多态: 同一个对象, 多种形态. 这个在python中其实是很不容易说明白的. 因为我们一 直在用. 只是没有具体的说.  比如. 我们创建一个变量a = 10 , 我们知道此时a是整数类型. 但是我们可以通过程序让a = "alex", 这时, a又变成了字符串类型.  这是我们都知道的. 但是, 我要告诉你的是. 这个就是多态性. 同一个变量a可以是多种形态.
     1 class Animal:    
     2     def chi(self):
     3         print("动物就知道吃")
     4 class Pig(Animal):
     5     def chi(self):
     6             print("猪在吃")
     7 class Haski(Animal):
     8     def chi(self):
     9             print("哈?士奇在吃")
    10 class Alasika(Animal):
    11     def chi(self):       
    12         print("阿拉斯加在吃")
    13 class SiYangYuan:
    14     def yanng_animal(self, ani):  
    15         ani.chi()
    16         
    17 zhu = Pig()
    18 erha = Haski()
    19 ala = Alasika()
    20 alex = SiYangYuan()
    21 alex.yanng_animal(zhu)
    22 alex.yanng_animal(erha)
    23 alex.yanng_animal(ala)
    程序具有超高的可扩展性.  面向对象思想的核心与灵魂. python自带多态
     
    四、类对象补充
     1 一:我们定义的类的属性到底存到哪里了?有两种方式查看
     2 dir(类名):查出的是一个名字列表
     3 类名.__dict__:查出的是一个字典,key为属性名,value为属性值
     4 
     5 二:特殊的类属性
     6 类名.__name__# 类的名字(字符串)
     7 类名.__doc__# 类的文档字符串
     8 类名.__base__# 类的第一个父类(在讲继承时会讲)
     9 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
    10 类名.__dict__# 类的字典属性
    11 类名.__module__# 类定义所在的模块
    12 类名.__class__# 实例对应的类(仅新式类中)
  • 相关阅读:
    javascript,函数声明和函数表达式
    javascript,小数值舍入操作方法:ceil()、floor()、round()
    javascript,子字符串操作方法:Slice()、Substr()、Substring()的区别
    javascript,第一个基于node.js的Http服务
    javascript,创建对象的3种方法
    MFC学习笔记2——MFC和Win32
    Qt下 QString转char*
    [转载] Qt程序在Windows下的mingw发布
    VC 获取当前时间
    MFC 对话框设计问题(控件的使用)
  • 原文地址:https://www.cnblogs.com/hq82/p/9703622.html
Copyright © 2011-2022 走看看