python面向对象进阶-02类的派生
类的派生和覆盖
什么是派生
子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准
当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类
通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类,
所以派生类指的就是子类
什么是覆盖
也称之为重写 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__方法就会报错)