首页 > 技术文章 > python面向对象进阶-02类的派生

suren-apan 2019-09-21 10:54 原文

类的派生和覆盖

什么是派生

子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准
当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类
通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类,

所以派生类指的就是子类

什么是覆盖

也称之为重写 overrides
当子类出现了与父类名称完全一致的属性或是方法

覆盖的列子

class Person:
    def say_hi(self):
        print("hello")

class Student(Person):
    def say_hi(self):
        print("hello world!")

stu = Student()
stu.say_hi()

关于继承list的限制传入类型的数据容器

"""
需求 实现一个能够限制元素类型的列表类
"""
class MyList(list):
    def __init__(self,element_type):
        super().__init__() # 调用父类的初始化方法 来完成基本的初始化
        self.element_type = element_type

    def append(self, object):
        """
        :param object: 是要存储的元素
        :return: 没有
        """
        if type(object) == self.element_type:
            #我们需要在这里访问父类的append函数来完成真正的存储操作
            super(MyList,self).append(object)
        else:
            print("sorry sir, you element type not is %s" % self.element_type)

# 创建是指定要存储的元素类型
m = MyList(int)
# 当你有需求,是需要在创建对象时 干点什么事儿  那就该想到初始化方法

m.append(1)
print(m[0])
# 下面这个就是出问题的  因为之前传入的参数是int类型 下面的参数不符合
m.append("121212")

子类访问父类的3种方法

supper (单继承第一优先级使用supper方法!!!!!!!!!!!)

严格以来继承属性查找关系
super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
super().init(不用为self传值)
super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()

实例:

class Parent:
    text = "abc"
    def say_something(self):
        print("anything")

class Sub(Parent):
    def show_info(self):
        # print(super(Sub,self).text)
        # super(Sub,self).say_something()

        # 访问方式2  py3的新语法 最常用的方式
        print(super().text)
        super().say_something()

        #方式3 直接指定类名调用
        # print(Parent.text)
        # Parent.say_something(self)

总结:
方式1:
super(当前类名称,self).你要调的父类的属性或方法
方式2:
super().你要调的父类的属性或方法
方式3:
类名称.你要调的父类的属性或方法(self)
#方式3与继承无关

重点内容!!!!!!

当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数
本人大白话原因总结:子类自身的__init__方法会替换掉父类的__init__方法,如果子类本身就需要父类相关的__init__执行后效果,就需要先在自身__init__实例相关执行前 执行父类的__init__方法,同时父类的此方法也同时有可能可以简化子类的__init__相关的代码,一举两得!!(无论有无有用,个人觉得在日后的编程过程中加上总是没错的.同时在pycharm中如果没有在之前调用父类的__init__方法就会报错)

推荐阅读