一、继承简述及基本语法
# 1.继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可以
# 称为基类和超类,新建的类称为派生类和子类
# python中类的继承分为:单继承和多继承
2.为什么要使用继承:继承的一方可以直接使用被继承一方已经有的东西其目的是为了重用已经有的代码,提高重用性
class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类,派生类 class AB_son(A): pass # 一个类可以被多个类继承 # 一个类可以继承多个父类 仅在python里 print(A_son.__bases__) print(AB_son.__bases__) print(A.__bases__) # 没有继承父类默认继承object class Animal: def __init__(self, name, aggr, hp): self.name = name self.aggr = aggr self.hp = hp def eat(self): self.hp += 100 print("回血") class Person(Animal): def __init__(self, name, aggr, hp, sex): Animal.__init__(self, name, aggr, hp) self.hp = hp # 派生属性 class Dog(Animal): def __init__(self, name, aggr, hp, type): # Animal.__init__(self, name, aggr, hp) super().__init__(name, aggr, hp) # 只在新式类中有,python中都是新式类 self.type = type # 派生属性 def eat(self): # Animal.eat(self)# 如果既想要实现新的功能,又想再子类调用父类 super().eat() self.teeth = 2 def bite(self, person): # 派生方法 person.hp -= self.aggr jin = Dog("金老板", 100, 500, "吉娃娃") alex = Person("tank", "100", 600, "畜生") super(Dog, jin).eat() # 在外面掉用需要传类和对象 print(alex.hp) jin.eat() print(jin.hp) # 父类中没有的属性,在子类中出现,就叫派生属性 # 父类中没有的方法,在子类中出现,就叫派生方法 # 只要是子类的对象调用,子类中有的名字一定要用子类的,子类中没有才找父类,如果父类也没有就报错 # 如果父类 子类都有,就用子类 # 如果还想用父类的,单独调用父类的,需要自己传self参数
二、继承与抽象
抽象:不具体,不清晰,很模糊,看不懂
将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程也称之为抽象的过程
正确的使用继承:
1.先抽象在继承
2.继承一个已经现存的类,扩展或是修改原始的功能
# 抽取老师和学生中相同的部分形成person类 class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def say_hi(self): print("name:%s,gender:%s,age:%s" % (self.name,self.gender,self.age)) class Teacher(Person): def teaching(self): print("老师教学生,写代码....") t1 = Teacher("jack","male",20) t1.say_hi() class Student(Person): pass stu1 = Student("rose","female",18) stu1.say_hi()
三、属性的查找顺序
# class A: # text = "haha" # # class B(A): # text = "heihei" # pass # # b = B() # print(b.text) # heihei
对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object
四、派生与覆盖
派生:就是父类里面没有的,子类有称为派生
覆盖:也称之为重写 overrides,当子类出现了与父类名称完全一致的属性或是方法
class Person: def say_hi(self): print("hello") class Student(Person): def say_hi(self): print("hello world!") stu = Student() stu.say_hi()
五、子类调用父类
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) # sub = Sub() # sub.show_info()
六、初始化方法必须调用
# 为什么要在初始化方法中调用 父类的初始化方法 class Person: def __init__(self,name,gender,age,*args): self.name = name self.gender = gender self.age = age self.aa() def aa(self): print("aa run") def say_hi(self): print("name:%s ,gender:%s,age:%s" % (self.name,self.gender,self.age)) class Student(Person): def __init__(self,name,gender,age,number): super().__init__(name,gender,age) self.number= number def say_hi(self): super().say_hi() print("numnber:%s" % self.number) stu = Student("rose","mael",20,"old01") stu.say_hi() # 如果子类
七、实现一个可以限制元素列表类型
需求 实现一个能够限制元素类型的列表类 """ 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]) m.append("121212")
#### 强调在强调:
当你继承一个现有的类,并且你覆盖了父类的init方法时,必须在初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数