Python学习手册之类和继承

发布时间:2019-04-10 20:53:14编辑:auto阅读(1824)

    在上一篇文章中,我们介绍了 Python 的函数式编程,现在我们介绍 Python 的类和继承。

    查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10010690.html


    先前,我们研究过两种编程范式--命令式(使用语句、循环和函数)和函数(使用纯函数、高阶函数和递归)。
    接下来我们学习一个编程方式是面向对象编程 —— Object Oriented Programming,简称 OOP,这是一种程序设计思想。OOP 把对象作为程序的基本单元,类描述对象将是什么,一个对象包含了数据和操作数据的函数。
    面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
    而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息并处理这些消息。计算机程序的执行就是一系列消息在各个对象之间传递。
    类是使用关键字 class 和缩进块创建的,缩进块包含类方法(这些是函数)。

    class Dog:
     def __init__(self,name): #__init__传参数
      self.name = name
    
    d1 = Dog("张三")
    d2 = Dog("李四")
    d3 = Dog("王五")
    数据封装、继承和多态是面向对象的三大特点。

    __init__方法
    __init__方法是类中比较重要的方法,它在创建类的实例(对象)时调用,这种方法创建的属性我们称为实例变量。
    类中所有方法都必须将 self 作为它们的第一个参数,尽管它没有显式传递,但是 Python 将 self 参数添加到列表中。在调用方法时不需要包含它。在方法定义中,self 引用调用该方法的实例。类的实例具有属性,这些属性是与实例关联的数据。
    在本例中,Dog 实例将具有 nameeyes 的属性。可以通过实例后面加点和属性名来访问这些值。同样,在 __init__ 方法中,可以使用 self.attribute 来设置实例属性的初始值。

    class Dog:
     def __init__(self,name,eyes): #__init__传参数
      self.name = name
      self.eyes = eyes
    
    d1 = Dog("张三",2)
    d2 = Dog("李四",2)
    d3 = Dog("王五",2)
    print(d1.name)
    print(d2.name)
    print(d3.name)
    特殊方法 __init__ 前后分别有两个下划线!
    在上面的实例中,__init__ 方法接受两个参数,并将它们分配给对象的属性。__init__ 方法称为类构造函数。

    方法
    类可以定义其他方法用来添加一些功能。请记住,所有方法都必须将 self 作为它们的第一个参数。使用点加属性的语法来访问这些方法。

    class Dog:
     def __init__(self,name,eyes): #__init__传参数
      self.name = name
      self.eyes = eyes
    
     def bulk(self):
      print("%s:wang wang wang!" %self.name)
    
    d1 = Dog("张三",2)
    d2 = Dog("李四",2)
    d3 = Dog("王五",2)
    
    d1.bulk()
    d2.bulk()
    d3.bulk()

    运行结果:

    >>>
    张三:wang wang wang!
    李四:wang wang wang!
    王五:wang wang wang!
    >>>

    类属性一种是通过 __init__ 方法来定义,也可以自己直接定义类属性,这种属性我们叫它类变量。它是通过在类的主体内分配变量创建的。可以从类的实例或类本身访问它们。

    class Dog:
     def __init__(self,name,eyes): #__init__传参数
      self.name = name
      self.eyes = eyes
    
    d1 = Dog("张三",2)
    d2 = Dog("李四",2)
    d3 = Dog("王五",2)
    
    print(d1.name)
    print(d2.name,d2.eyes)
    print(d3.eyes)

    运行结果:

    >>>
    张三
    李四 2
    2
    >>>
    类变量由类的所有实例共享。

    尝试访问一个实例中未定义的属性或方法会导致 AttributeError 异常。

    class Student:
     def __init__(self,id,name):
      self.id = id
      self.name = name
    
    man = Student(10086,"China")
    print(man.id)
    print(man.sex)

    运行结果:

    >>>
    10086
    AttributeError: 'Student' object has no attribute 'sex'
    >>>

    继承
    通过在两个类中共享函数实现继承。
    想像以下有些类,比如 Cat, Dog, Rabbit。尽管它们有一些不同,但是它们都有颜色,名字属性。
    这些相同点可以通过继承父类 Animal 来实现这些共享的属性方法。继承最大的好处是子类获得了父类的全部功能。

    class Animal:
     def __init__(self,name,sex):
      self.name = name
      self.sex = sex
    
    class Cat(Animal):
     def talk(self):
      print('Neow!')
    
    func = Cat("ZS","F")
    print(func.name)
    func.talk()

    运行结果:

    >>>
    ZS
    Neow!
    >>>

    OOP 程序设计中,当我们定义了一个 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类 (Subclass) , 而被继承的 class 称为基类、父类或超类 (Base class、Super class)。
    如果一个子类拥有一个和父类相同的属性和方法,我们称为重写 (override)。在代码运行的时候,总是会调用子类的方法。

    class Animal:
     def __init__(self,name,sex):
      self.name = name
      self.sex = sex
    
     def take(self):
      print("Hello...")
    
    class Cat(Animal):
     def talk(self):
      print('Neow!')
    
    func = Cat("ZS","F")
    print(func.name)
    func.talk()

    运行结果:

    >>>
    ZS
    Neow!
    >>>
    上面例子中 Animal 是父类,Cat 是子类。

    子类同样可以做为父类被继承,这样继承的子类拥有两个父类的方法和属性。

    class A:
     def func_A(self):
      print("A 类")
    
    class B(A):
     def func_B(self):
      print("B 类")
    
    class C(B):
     def func_C(self):
      print("C 类")
    
    obj = C()
    obj.func_A()
    obj.func_B()
    obj.func_C()

    运行结果:

    >>>
    A 类
    B 类
    C 类
    >>>
    注意:尽量不要循环继承。

    方法 super 用来在子类中代指父类,可以用于在实例的父类中找到具有特定名称的方法。

    class Animal:
     def msg(self):
      print("It's a dog!")
    
    class Cat(Animal):
     def talk(self):
      print('Neow!')
      super().msg()
    
    Cat().msg()

    运行结果:

    >>>
    It's a dog!
    >>>
    Cat().msg() 调用父类的 msg 方法。

     

     

     

    “你们纪念的只是过去,如果拉上你的各种同学到你面前,你们还是无话可说。”

关键字