小白教程

 找回密码
 立即注册

重用

发布者: 小白教程

面向对象编程的主要好处之一是代码的重用,而实现这一目标的方法之一就是通过继承机制。最好将继承想象为在类之间实现类型和子类型关系。

假设您要编写一个程序,该程序必须跟踪大学中的老师和学生。它们具有一些共同的特征,例如名称,年龄和地址。它们还具有特定的特征,例如薪水,教师的课程和假期以及学生的分数和费用。

您可以为每种类型创建两个独立的类并对其进行处理,但是添加新的共同特征将意味着同时添加这两个独立的类。这很快变得笨拙。

更好的方法是创建一个名为的通用类SchoolMember,然后让教师和学生类从该类继承,即,它们将成为该类型的子类型(类),然后我们可以为这些子类型添加特定的特征。

这种方法有很多优点。如果我们在中添加/更改任何功能SchoolMember,这也会自动反映在子类型中。例如,您可以通过简单地将其添加到SchoolMember类中来为教师和学生添加一个新的ID字段。但是,子类型中的更改不会影响其他子类型。另一个优点是,您可以将教师或学生对象称为SchoolMember对象,在某些情况下(例如对学校人数进行计数),该对象可能会很有用。这被称为多态性,在这种情况下,在任何需要父类型的情况下都可以替换子类型,即可以将对象视为父类的实例。

还要注意,我们重用了父类的代码,我们不需要在不同的类中重复它,就可以避免使用独立类的情况。

SchoolMember在这种情况下该类称为基类超类TeacherStudent类被称为派生类子类

现在,我们将该示例视为一个程序(另存为oop_subclass.py):

class SchoolMember:
    '''Represents any school member.'''
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('(Initialized SchoolMember: {})'.format(self.name))

    def tell(self):
        '''Tell my details.'''
        print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ")


class Teacher(SchoolMember):
    '''Represents a teacher.'''
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print('(Initialized Teacher: {})'.format(self.name))

    def tell(self):
        SchoolMember.tell(self)
        print('Salary: "{:d}"'.format(self.salary))


class Student(SchoolMember):
    '''Represents a student.'''
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks
        print('(Initialized Student: {})'.format(self.name))

    def tell(self):
        SchoolMember.tell(self)
        print('Marks: "{:d}"'.format(self.marks))

t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)

# prints a blank line
print()

members = [t, s]
for member in members:
    # Works for both Teachers and Students
    member.tell()

输出:

$ python oop_subclass.py
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)

Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"25" Marks: "75"

这个怎么运作

要使用继承,我们在元组中在类定义中的类名称之后指定基类名称(例如class Teacher(SchoolMember))。接下来,我们观察到__init__使用self 变量显式调用了基类方法, 以便我们可以在子类中初始化实例的基类部分。记住这一点非常重要-由于我们__init__ 在Teacher 和 Student 子类中定义了一个 方法,Python不会自动调用基类的构造函数,因此 SchoolMember您必须自己显式调用它。

相反,如果我们尚未__init__ 在子类中定义 方法,则Python将自动调用基类的构造函数。

尽管我们可以像对待的实例一样对待TeacherStudentSchoolMember然后只需键入访问tell方法,但我们而是在每个子类中定义另一个方法(使用for的一部分方法)来为该子类定制它。因为这样做了,所以在编写Python时,Python对该子类和超类使用了该方法。但是,如果子类中没有方法,Python将使用SchoolMemberTeacher.tellStudent.telltelltellSchoolMemberTeacher.tell

上一篇:init 方法下一篇:Python中的输入

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 01:40 , Processed in 0.066102 second(s), 18 queries .