《Python编程从入门到实践》第九章

创建和使用类

一个例子:创建一个小狗的类,根据实际情况(或功能)赋予小狗蹲下(sit)和打滚(roll_over)的能力

class Dog():
    def __init__(self, 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!")

其中的init()可以理解为python的“构造方法”,init()是一个特殊的方法,每当我们根据Dog类创建实例时,都只需给后两个形参(name和age)提供值, Python都会自动运行它。而self可以理解为C++中的this。self会自动传递,因此我们不需要传递它。

创建实例:

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() 
my_dog.roll_over() 

print("\nYour dog's name is " + your_dog.name.title() + ".") 
print("Your dog is " + str(your_dog.age) + " years old.") 
your_dog.sit()

方法 init()并未显式地包含return语句,但Python自动返回一个表示这条小狗的实例。在这个实例中,我们创建了两条小狗,它们分别名为Willie和Lucy。每条小狗都是一个独立 的实例,有自己的一组属性,能够执行相同的操作。就算我们给第二条小狗指定同样的名字和年龄,Python依然会根据Dog类创建另一个实例。
最好不要从外部直接访问类中的属性,如上例中name与age,直接修改会违背OOP的思想,最好通过一个接口(方法)对属性进行修改,同时属性最好设置为私有的形式。

继承

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

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def get_descriptive_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.")
    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
    def increment_odometer(self, miles):
        self.odometer_reading += miles

class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery_size = 70
    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name)
my_tesla.describe_battery()

创建子类时,父类必须包含在当前文件中,且位于子类前面。 super()用来将父类和子类关联起来。super().init(blabla)让ElectricCar实例包含父类的所有属性。父类也称为超 类(superclass),名称super因此而得名。
除了添加新的方法外,还可以重写父类的方法,。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方 法,而只关注你在子类中定义的相应方法。

为了简化代码,可以将大型类拆分成多个协同工作的小类:

class Car():
    pass
#    --snip--

class Battery():
    def __init__(self, battery_size=70):
        self.battery_size = battery_size
    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWh battery.")
    def get_range(self):
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270
        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)
class ElectricCar(Car):
    def__init__(self, make, model, year):
        super().__init__(self, make, model, year)
        self.battery = Battery()
my_tesla = ElectricCar('Tesla', 'model s', 2016)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

在本章中,你学习了:如何编写类;如何使用属性在类中存储信息,以及如何编写方法,以 让类具备所需的行为;如何编写方法init(),以便根据类创建包含所需属性的实例。你见识 了如何修改实例的属性——包括直接修改以及通过方法进行修改。你还了解了:使用继承可简化 相关类的创建工作;将一个类的实例用作另一个类的属性可让类更简洁。

你可能感兴趣的:(《Python编程从入门到实践》第九章)