欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python 面向对象详解 - 类与继承

最编程 2024-04-10 07:03:58
...

Python虽然以函数式著称,但在Python中,万物皆对象,其对面向对象编程是有着非常不错的支持的。类是面向对象的核心数据类型,下面代码就创建了一个Person类。

class Person:
    count = 0
    def __init__(self, name, ID):
        self.name = name
        self.ID = ID
        Person.count += 1
    def introduce(self):
        print(f"I'm {self.name}")
    def peopleCount(self):
        print(f"There are {Person.count} persons")

p1 = Person("micro", 1)
p2 = Person("cold", 2)
p1.introduce()      # I'm micro
p1.peopleCount()    # There are 2 persons

其中,__init__函数用于类的初始化,参数self表示当前对象。所以创建p1和p2时,两人分别被赋予了不同的姓名和编号,并可通过introduce方法进行调用。

写在类内部、函数外部的变量属于整个类的共有变量,所以每当创建一个新的对象时,count都会加一。所以,无论p1还是p2在调用peopleCount函数时,均回得到共有两人的结果。当然,随着创建对象的增多,这个值也会随之增长。

在一个类中,一般变量被称作成员变量,函数被称作成员函数,也可称为方法。

如果只用一个关键词来形容面向对象,那么这个关键词一定是继承,不能继承的类将和结构体没什么区别。下面是一个继承了【Person】的类。

class Student(Person):
    def __init__(self, name, ID, grade):
        super(Student, self).__init__(name, ID)
        self.grade = grade
    def introduce(self):
        print(f"I'm {self.name}", end=', ')
        self.getGrade()
    def getGrade(self):
        print(f"my grade is {self.grade}")

p3.introduce()      # I'm soft, my grade is 4
p3.peopleCount()    # There are 3 persons

在类的继承过程中,如果想连带着继承类的某个方法,那么就可以直接将这个方法省略,比如peopleCount,便直接沿用了Person类中的内容。

相应地,如果重新写了这个函数,那么这个函数就会焕然一新,而与父类的同名方法变得毫无关联,这个过程叫做方法重写。introduce就是这种情况,虽然与Person类有着相同的名字,但输出结果发生了变化。

初始化函数也是一样,如果省略,就会沿用父类的做法;如果重写,就会变得与父类无关。super函数为子类和父类的函数之间架设了一道桥梁,super(Student, self)即可找到Student的父类,并调用其中的函数。所以Student类尽管重写了初始化方法,但也沿用了父类的一些处理,从而节约了代码。

推荐阅读