在面向对象编程(OOP)中,类是一个允许一组属性和函数(一般称方法)糅合在一起的数据结构。 下面定义的这个Person类定义了“name”和“age”属性,同时还有一个“greet”方法:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def greet(self):
        print("Hello, my name is %s!" % self.name)

大部分类都需要构造方法(__init__)来初始化类的一些属性。在之前的代码中,这个类的构造方法接收一个人的名字和年龄并将这些信息保存在类的实例中(使用self关键字访问的)。 “greet”方法则是打印存储在类实例(object)中的名字(name)。 类实例通过实例化到对象中使用。下面的代码展示了我们如何实例化两个对象:

>>> a = Person("Peter", 20)
>>> b = Person("Anna", 19)
>>> a.greet()
Hello, my name is Peter!
>>> b.greet()
Hello, my name is Anna!
>>> print(a.age) # We can also access the attributes of an object
20

类部分练习

自行研究Python文档: https://docs.python.org/3/tutorial/classes.html 完成下列练习:

  1. 写一个名为“Rectangle” 的类,存储给定的长方形坐标(x1, y1), (x2, y2)。
  2. “Rectangle”类的构造方法接受4个参数(x1, y1, x2, y2)使用self关键字将它们存到类实例中。
  3. 给这个类写一个width()方法和height()方法,分别返回这个长方形的宽和高。创建两个“Rectangle”实例对象来测试一下。
  4. 再写一个area方法,作用是返回这个长方形的面积(宽*高)。
  5. 最后写一个circumference方法,返回的是这个长方形的周长(宽*高*2)。
  6. __str__方法改写为返回长方形坐标(x1, y1)(x2, y2)。然后打印所创建的类对象中的一个进行测试。

类继承

在面向对象编程中,继承是一种子类可以从另一个类中得到其属性和方法的形式,并允许其重写超类(被继承的类)的功能。 比如,基于我们上面写的“Person”类,我们创建一个子类,让这个子类的所产生的人年龄总为10:

class TenYearOldPerson(Person):
    def __init__(self, name):
        super().__init__(name, 10)

    def greet(self):
        print("I don't talk to strangers!!")

在第一行中指出“TenYearOldPerson”类是“Person”类的子类。之后我们重写子类的构造方法,让它只接受人的名字,但最终我们还要调用超类(被继承的类)的构造方法,参数是这个人的名字和年龄10。最后我们重写了“greet”方法。

继承部分练习

使用之前定义的“Rectangle”类来进行下列练习:

  1. 创建一个“Square”类,它是“Rectangle”的子类。
  2. 为“Square”类写上构造方法。构造方法只包含x1, y1两个坐标以及正方形的大小。记住,当你使用“super”来调用“Rectangle”的构造方法时你仍会用到这些参数。
  3. 实例化两个“Square”对象,调用area方法并打印这个对象。确保所有的计算返回的是正确的结果,传入参数时应保证正方形的坐标始终与正方形的大小一致。

书籍推荐