zoukankan      html  css  js  c++  java
  • Python 之继承

    概要

    如果要修改现有类的行为,我们不必再从头建一个新的类,可以直接利用继承这一功能。下面将以实例相结合介绍继承的用法。
     


    新建一个基类

    代码如下:

    class Marvel(object):    
        num_presents = 0 # 类变量,统计类实例中记录的作品数量
        def __init__(self, film_name, role):
            """
            file_name: 影名,字符串
            role: 影片角色,列表
            """
            self.film_name = film_name
            self.role = role
            Marvel.num_presents += 1
        def __del__(self):  # 调用 del 方法删除类实例时,作品数量同时-1
            Marvel.num_presents -= 1
        def add_role(self, name): 
            self.role.append(name)
        def reduce_role(self, name):
            self.role.remove(name)
        def inquiry(self, name):
            return name in self.role
    

    上述代码中的类声明也可以省略写成 class Marvel:, 因为 object 是所有 Python 对象的根类。

    其中 num_presents 是类变量,它是在类的所有实例之间共享的值。可以通过实例名或者类名 + . 的方式访问该变量值。在我们的实例中,该类变量是统计我们记录的漫威作品数量,每次声明一个作品时,该值就会自动增一,而且如果我们调用 del 方法删除作品时,会自动减一。示例如下:

    a = Marvel('Revengers-1', ['Iron Man', 'Cap'])  # 创建一个类实例
    print(a.num_presents) # 输出 1 等价于 Marvel.num_presents
    b = Marvel('Revengers-2', ['Hulk', 'Cap'])   # 再创建一个类实例
    print(a.num_presents) # 输出 2
    del(a)
    print(b.num_presents) # 输出 1
    

    值得一提的是,如果你重复运行同样的程序(重复运行前内存中变量却没清除),小心输出的类变量值不一样。这就涉及了 python 的垃圾回收机制,简单地说,对于我们的实例,如果你对同样的变量名,比如 a,执行两次类实例声明操作,类变量的值 num_presents 不会变为 2,因为你再第二次赋值时,后台默认已经执行 del 方法回收了被覆盖掉的变量。

     

    新建一个子类

    class secondMarvel(Marvel):
        def __init__(self, film_name, role, score):
            Marvel.__init__(self, film_name, role)  # 等价于 super().__init__(film_name, role)
            self.score = score
        def add_role(self, name):
            if name in self.role:
                print("Warning: ", name, 'already exists in role !')
            super().add_role(name)  # python 3 , python 2 用 super(secondMarvel, self).add_role(name) 
    

    在上述代码中,子类 secondMarvel 重新定义了 __init__ 函数,增加了一个属性 score(当然如果没必要增加属性,也就没必要重写该初始化函数)。而一旦重写了初始化函数,那么它不会自动调用基类的 __init__ 函数,所以我们要用显式地进行初始化声明(即 Marvel.__init__()),注意第一个参数是 self

    另外我们改写了 add_role 方法,如果此时我们仍想调用基类中的方法实现,使用 super 方法即可。我们新写的方法只是打印出了警告而已。

     


    总结

    python 中的继承也支持多重继承,即一个子类可以同时有多个父类,此时如果继承的属性命名为惟一,搜索属性时会变得非常复杂,而实际应用中应该避免这种情况。本篇简单地介绍一下 python 中的继承机制以及了解其中一些实用技巧,在实际应用中可以多加尝试通过构建子类简化代码。
     

  • 相关阅读:
    Linux下安装firefox最新版
    php开发网站编码统一问题
    WordPress前台后台页面打开慢的解决方法
    超链接标签简单的几个样式属性
    jQuery结合Ajax实现简单的前端验证和服务端查询
    Javascript配合jQuery实现流畅的前端验证
    Code-Validator:验证只包含英文字母
    Code-Validator:验证小数
    Code-Validator:验证正整数
    Code-Validator:验证非负整数
  • 原文地址:https://www.cnblogs.com/zhoukui/p/10802305.html
Copyright © 2011-2022 走看看