创建和使用类

创建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
posted @ 2018-12-23 23:35  Rener  阅读(253)  评论(0编辑  收藏  举报