创建和使用类
创建Dog类
class Dog(): #定义了一个名为Dog的类,首字母大写名称指的是类
'''一次模拟小狗的简单尝试'''
def __init__ (self,name,age): #开头和结尾各有两个下划线是种约定
'''初始化属性name和age'''
#形参self必不可少,必须在其他形参之前。创建实例时,将自动传入实参self
#每当根据Dog类1创建实例时,只需给后两个形参(name,age)提供值。
self.name=name #获取存储在形参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!')
根据类创建实例
class Dog():
--snip--
my_dog= Dog('willie',6) #小写的名称my_dog指的事根据类创建的实例。
#my_dog.name,在Dog类中引用这个属性时,使用的是self.name
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()
使用类和实例
Car类
class Car():
#一次模拟汽车的简单尝试
def __init__(self,make,model,year):
#初始化描述汽车的属性
self.make=make
self.model=model
self.year=year
def get_descriptive_name(self):
#返回整洁的描述性信息
long_name=str(self.year) + ' ' +self.make + ' ' + self.model
return long_name.title()
my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
给属性指定默认值
设置默认值,在方法__init__()内指定这种初始值是可行的,无需包含为它提供初始值的形参
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):
--snip--
def read_odometer(self):
print('This car has '+str(self.odometer_reading)+' miles on it.')
my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
修改属性的值
#直接修改
my_new_car=Car('audi','a4','2016')
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading=23
my_new_car.read_odometer()
#通过方法修改属性的值
def update_odometer(self,mileage):
将里程表读数设置为指定的值
self.odometer_reading=mileage
--snip--
my_new_car.update_odometer(23)
my_new_car.read_odometer()
继承
如果编写的类是另一个现成类的特殊版本,可使用继承
子类的方法__init__()
#父类必须包含在当前文件中,且位于子类的前面。
class ElectricCar(Car):#定义子类时,括号内指定父类的名称
def __init__(self,make,model,year):
#初始化父类的属性
super().__init__(make,model,year)
#super()是个特殊函数,帮助父类和子类关联起来,父类也成为超类(superclass)
my_tesla=ElectricCar('tesla',"model s'",2016)
print(my_tesla.get_descriptive_name())
重写父类的方法
可在子类中定义一个这样的方法,即它与重写的父类方法同名。
这样python将不会考虑这个父类方法
class ElectricCar(Car):
--snip--
def fill_gas_tank(self):
print("This car doesn't need a gas tank!")
对电动汽车调用方法fill_gas_tank(),python将忽略Car类中的方法,转而运行上述代码
用实例用作属性
class Car():
--snip--
class Battery():
#一次模拟电动汽车电瓶的简单尝试
def __init__(self,battery_size=85):
#初始化电瓶的属性
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__(make,model,year)
self.battery=Battery()
my_tesla=ElectricCar('tesla',"model s'",2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
#这行代码让python在实例my_tesla中查找属性battery,并对存储在该属性中的battery实例调用方法describe_battery()
my_tesla.battery.get_range()
导入类
导入单个类
car.py
class car():
--snip--
my_car.py
from car import Car
--snip--
在一个模块中存储多个类
car.py
class Car():
--snip--
class Battery():
--snip--
class ElectricCar(Car):
--snip--
my_electryc_car.py
from car import ElectricCar
--snip--
从一个模块中导入多个类
my_cars.py
from car import Car,ElectricCar
#导入指定类
from car import *
#导入模块中所有类
导入整个模块
my_cars.py
import car