类
创建和使用类
一个例子:创建一个小狗的类,根据实际情况(或功能)赋予小狗蹲下(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(),以便根据类创建包含所需属性的实例。你见识 了如何修改实例的属性——包括直接修改以及通过方法进行修改。你还了解了:使用继承可简化 相关类的创建工作;将一个类的实例用作另一个类的属性可让类更简洁。