9 - 继承和多态

来源:互联网 发布:淘宝广告图在线制作 编辑:程序博客网 时间:2024/05/31 19:45

1. 继承的实现方法与注意事项

class ChildClass(ParentClass):
  • 子类会继承父类的所有可访问的数据域和方法,它也可以定义自己的数据域和方法。
  • 子类在 __init__ 函数中需要调用父类的 __init__ 方法去初始化。常用的方法是:super().__init__()(避免显示指向父类),不需要传递 self 参数
  • Python 允许从几个类派生出一个子类,称为多重继承
  • 方法覆盖:子类可以重新实现父类的方法,方法时必须使用与父类一样的方法头。注意私有方法不可覆盖!

2. object类

Python 的所有类都派生自object类。如果定义一个类的时候没有指定它的父类,那么它的父类默认就是object类。

熟悉object类的方法是十分重要的,主要看以下四个方法:

  • __new__ 创建对象的时候被自动调用,它随后会调用__init__方法来初始化这个对象,一般只应该覆盖__init__方法来初始化新类中定义的数据域
  • __init__
  • __str__ 返回一个描述该对象的字符串,默认返回信息如下:
loan = loan(1, 1, 1, "Smith")print(loan)<Loan.Loan object at 0x01B99C10>

这样的信息是没有太大意义的,通常应该覆盖这个__str__方法,这样它就可以返回一些代表该对象的描述性的字符串了。

  • __eq__ 如果两个对象相等,那么__eq__返回的是True,但是这是根据内存的位置来确认的。如果要让两个数据域相同的对象时返回True,那么应该覆盖这个方法。Python中的许多像int、float、bool、string和list这样的内置类中,__eq__方法被覆盖以使两个对象内容相同时返回True。

3. 多态和动态绑定

  • 多态:子类的对象可以作为参数传递给需要父类类型参数的函数(子类代替父类),这样一个方法可以沿着继承链的几个类执行
  • 动态绑定:运行时由Python动态的决定该调用那个方法
class Student:    def __str__(self):        return "Student"    def printStudent(self):        print(self.__str__())class GraduateStudent(Student):    def __str__(self):        return "Graduate Student"a = Student()b = GraduateStudent()a.printStudent()b.printStudent()

4.isinstance函数:判断一个一个对象是否是一个类的实例

用法如下:

isinstance(object, ClassName)

例如:

isinstance("abc", str)

将返回True

5.类之间的关系

  • 关联
    描述两个类之间的动作,如一个学生可以选修多门课程,一个课程可以被多位学生选中。这就说明Student类与Course之间的一种关联。
   class Student:       def addCourse(self, course):   class Course:       def addStudent(self, student):       def setFaculty(self, faculty):   class Faculty:       def addCourse(self, course): 
  • 聚合和组合
    反应两个类之间的归属关系,对 has-a关系进行建模。

一个学生有一个名字,一名学生有一个地址,一个地址可以被多个学生所拥有:

class Name:    ...class Student:    def __init__(self, name, addresss):        self.name = name        self.address = address    ...class Address:    ...         
0 0