(14)类(class)

14.1 创建类


根据Dog类创建的每个实例都将存储名字和年龄。我们赋予每条小狗蹲下(sit()) 和打滚(roll_over())的能力。


class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self,name,age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗蹲下"""
        print(self.name.title() + "is now sitting.")
    def roll_over(self):
        """模拟小狗打滚"""
        print(self.name.title() + "rolled over!")


根据约定,在 Python 中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。


方法 __init__(),称为类的一个特殊方法。每当你根据Dog类创建新实例时,Python 都会自动运行它。注意:开头和结尾各有两个下划线。


14.2 根据类创建实例


下面来创建一个表示特定小狗的实例:



my_dog = Dog('willie',6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old." )

My dog's name is Willie.
My dog is 6 years old.
14.2.1 访问属性


要访问实例的属性,可使用句点表示法。



my_dog.name
14.2.2 调用方法

根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法。

my_dog = Dog('willie',6)
my_dog.sit()
my_dog.roll_over()

Willieis now sitting.
Willie rolled over!
14.2.3 创建多个实例

可按照需求根据类创建任意数量的实例。

my_dog = Dog('willie',6)
your_dog = Dog('lucy',3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old." )
my_dog.sit()
print("My dog's name is " + your_dog.name.title() + ".")
print("My dog is " + str(your_dog.age) + " years old." )
your_dog.sit()

My dog's name is Willie.
My dog is 6 years old.
Willieis now sitting.
My dog's name is Lucy.
My dog is 3 years old.
Lucyis now sitting.
14.3 使用类和实例


class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self,make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year =year
    def get_decriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + " " + self.make + " " + self.model
        return long_name.title()

my_new_car = Car('audi','a4',2018)
print(my_new_car.get_decriptive_name())

2018 Audi A4


14.4 给属性指定默认值


类中的每个属性都必须有初始化,哪怕这个值是0或者是空字符串。在__init()__内指定这种初始化是可行的;如果你对某个属性这样做了,就无需包含为它提供初始化的形参。




class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self,make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year =year
        self.odometer_reading = 0
    def get_decriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + " " + self.make + " " + self.model
        return long_name.title()
    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it.")

my_new_car = Car('audi','a4',2018)
print(my_new_car.get_decriptive_name())
my_new_car.read_odometer()

2018 Audi A4
This car has 0 miles on it.


14.5 修改属性值
14.5.1 直接修改属性值
my_new_car = Car('audi','a4',2018)
print(my_new_car.get_decriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

2018 Audi A4
This car has 23 miles on it.
14.5.2 通过方法修改属性的值
class Car():
    --snip--
    def update_odometer(self,mileage):
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage
my_new_car = Car('audi','a4',2018)
print(my_new_car.get_decriptive_name())
my_new_car.update_odometer(26)
my_new_car.read_odometer()

2018 Audi A4
This car has 26 miles on it.



(15)继承


编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有的属性和方法;原来的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。



class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self,make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year =year
        self.odometer_reading = 0
    def get_decriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + " " + self.make + " " + self.model
        return long_name.title()
    def update_odometer(self,mileage):
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage
    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it.")

class ElectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)

my_tesla = ElectricCar('tesla','model s',2018)
print(my_tesla.get_decriptive_name())
2018 Tesla Model S


创建子类时,父类必须包含在当前文件中,且位于子类前面。我们在定义子类ElectricCar时,必须在括号里指定父类的名称。方法__init__(),接受创建Car实例所需要的信息。


super()是一个特殊函数,帮助Python将父类和子类关联起来。