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

  1. class Person:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def greet(self):
  6. print("Hello, my name is %s!" % self.name)

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

  1. >>> a = Person("Peter", 20)
  2. >>> b = Person("Anna", 19)
  3. >>> a.greet()
  4. Hello, my name is Peter!
  5. >>> b.greet()
  6. Hello, my name is Anna!
  7. >>> print(a.age) # We can also access the attributes of an object
  8. 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:

  1. class TenYearOldPerson(Person):
  2. def __init__(self, name):
  3. super().__init__(name, 10)
  4. def greet(self):
  5. print("I don't talk to strangers!!")

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

继承部分练习

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

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