面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象.编写类时,你定义一大类对象都有的通用行为.基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性.
根据对象编程被称为实例化,这让你能够使用类的实例.
使用类几乎可以模拟任何东西
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!")
#创建实例
my_dog = Dog('willie',6)
#1.访问属性
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
#2.调用方法
my_dog.sit()
my_dog.roll_over()
#3.创建多个实例
your_dog = Dog('lucy',3)
#1.访问属性
print("Your dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
运行结果:
My dog’s name is Willie.
My dog is 6 years old.
Willie is now sitting.
Willie rolled over!
Your dog’s name is Lucy.
Your dog is 3 years old.
例子如上,让我们来细细解析这个例子.
你可以使用类来模拟现实世界的很多情景.类编写好后,你的大部分时间都将花在使用根据类创建的实例上.你需要执行的一个重要任务是修改实例的属性.你可以直接修改实例的属性.也可以编写方法以特定的方式进行修改.
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("Your can't roll back an odometer!")
def increase_odometer(self,miles):
"""将里程表读数增加指定的量"""
#防止错误的修改
if miles >= 0:
self.odometer_reading += miles
else:
print("Your can't roll back an odometer!")
my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
#修改属性的值
#1.直接修改属性的值
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
#2.通过方法修改属性的值
my_new_car.update_odometer(23500)
my_new_car.read_odometer()
#3.通过方法对属性进行递增
my_new_car.increase_odometer(100)
my_new_car.read_odometer()
运行结果:
2016 Audi A4
This car has 0 miles on it.
This car has 23 miles on it.
This car has 23500 miles on it.
This car has 23600 miles on it.
例子如上,让我们来细细解析这个例子.
self.odometer_reading = 0
my_new_car.odometer_reading = 23
def update_odometer(self,mileage):
"""将里程表读数设置为指定的值"""
#防止错误的修改
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("Your can't roll back an odometer!")
my_new_car.update_odometer(23500)
def increase_odometer(self,miles):
"""将里程表读数增加指定的量"""
#防止错误的修改
if miles >= 0:
self.odometer_reading += miles
else:
print("Your can't roll back an odometer!")
my_new_car.increase_odometer(100)
注意:你可以使用类似于上面的方法来控制用户修改属性值的方式,但能够访问程序的人都可以通过直接访问属性来将里程表修改为任何值.要确保安全,除了进行类似上面的基本检查外,还需特别注意细节.
编写类时,并非总是要从空白开始.如果你要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的全部属性和方法,同时还可以定义自己的属性和方法.
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("Your can't roll back an odometer!")
def increase_odometer(self,miles):
"""将里程表读数增加指定的量"""
#防止错误的修改
if miles >= 0:
self.odometer_reading += miles
else:
print("Your can't roll back an odometer!")
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 == 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__(make,model,year)
self.battery = Battery()
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
运行结果:
2016 Tesla Model S
This car has a 70-kwh battery.
This car can go approximately 240miles on a full charge.
例子如上,让我们来细细解析这个例子.
class ElectricCar(Car):
super().__init__(make,model,year)
此时,电动汽车有了汽车的一般属性
self.battery_size = 70
这种定义方式使用于比较少的属性
self.battery = Battery()
在类Battery中:
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 == 85:
range = 270
message = "This car can go approximately " + str(range)
message += "miles on a full charge."
print(message)
这看似做了很多额外的工作,但现在我们想多详细描述电瓶都行.
个人认为:这种做法相当于前面的函数,一个个各司其职
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
现在,如果有人对电动汽车调用方法fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank(),转而运行上述代码.
随着不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此.为遵循Python的主题理念,应让文件尽可能整洁.为在这方面提供帮助,Python蕴蓄你将类存储在模块中,然后在主程序中导入所需的模块.
假如说,前面的三个类都存储在一个car.py文件中,然后,我们要在my_car.py文件从car.py导入类,有:
from car import Car
导入多个类:
- from car import Car,ElectricCar,Battery
可根据需要导入任意数量的类
import module_name
from module_name import *
不需要使用句号表示法即可访问,但不推荐使用.因为,可能导入与当前文件中同名的类,从而因此名称冲突.
将Car类存储在car.py中,ElectricCar类存储在electric_car.py中.
引用时:
from car import Car
from electric_car import ElectricCar
程序可正常运行
Python标准库是一组模块,安装的Python都包含它.
还可以从其他地方下载外部模块.比如:使用pip.
这种字符串简要地描述类的功能,并遵循编写字符串时采用的格式约定.每个模块也都应包含一个文档字符串,对其中的类可做什么进行描述.
个人从书本学到的知识,作为自己学习笔记的同时,与各位朋友分享,如有不足,请多多指教
参考文献:《Python编程从入门到实践》【美】Eric Matthes 著 袁国忠 译