编写类时,并不一定都是从空白开始。一个类也可以继承另一个类。
继承
首先编写一个表示饭店基本信息的类:
class Restaurant ():
"""一个饭店的基本信息"""
def __init__(self, name, main_food, phone, address):
self.name = name
self.main_food = main_food
self.phone = phone
self.address = address
self.slogen = '欢迎来本店吃饭!'
def print_info (self):
print ("名字: \t " + self.name)
print ("=====================")
print ("食品: \t " + self.main_food)
print ("联络: \t " + self.phone)
print ("地址: \t " + self.address)
print (self.slogen)
def set_slogen (self, slogen):
self.slogen = slogen
这个类接收饭店的名字、主营食品、电话和地址作为参数,并将其赋值给相应的属性。标语属性(slogen
)设置了一个默认值,可以通过专门的方法set_slogen()
来更新。还有一个print_info()
方法,可以显示饭店的基本信息。
下面的语句创建一个此类的实例,并调用了print_info()
方法:
hq_offal = Restaurant ('环球卤煮', '卤煮', '1234567890', '好莱坞环球影业旁边')
hq_offal.print_info()
执行结果如下:
名字: 环球卤煮
=====================
食品: 卤煮
联络: 1234567890
地址: 好莱坞环球影业旁边
欢迎来本店吃饭!
咖啡厅也是饭店的一种,现在新写一个咖啡厅类,它继承饭店类:
class Coffee_shop (Restaurant):
"""一个咖啡馆的基本信息"""
def __init__(self, name, main_food, phone, address, theme):
super().__init__(name, main_food, phone, address)
self.theme = theme
def print_info (self):
print ("名字: \t " + self.name)
print ("=====================")
print ("食品: \t " + self.main_food)
print ("主题: \t " + self.theme)
print ("联络: \t " + self.phone)
print ("地址: \t " + self.address)
print (self.slogen)
可以看到,在类名后面的括号()
里写入继承的类,即可继承该类,比如本例中class Coffee_shop (Restaurant):
表示Coffee_shop
类继承自Restaurant
类。
在继承一个类后,原有的类称为父类,新类称为子类。子类将自动的获得父类的属性和方法。
在新类Coffee_shop
初始化函数__init()__
中,使用了父类的初始化方法,即super().__init__()
,super()
代表父类,即Restaurant
类。在初始化过程中还定义了新类特有的属性theme
。
在新类中,重写了从父类继承的函数:print_info()
。当新类的实例调用此方法时,将使用新类的方法,而不是父类的同名方法。
下面为新类创建一个实例:
cat_coffee = Coffee_shop ('喵了个咪的喵的咖啡馆', '咖啡', '0987654321', '猫咪救助站旁边', '猫')
cat_coffee.set_slogen('这杯咖啡是朕赏给你的。')
cat_coffee.print_info()
这个例子中调用了子类Coffee_shop
的set_slogen()
方法,由于子类没有重写该继承自父类Restaurant
的方法,因此调用了父类的此方法。
执行结果如下:
名字: 喵了个咪的喵的咖啡馆
=====================
食品: 咖啡
主题: 猫
联络: 0987654321
地址: 猫咪救助站旁边
这杯咖啡是朕赏给你的。
将类作为属性
在Python中,可以将一个类作为另一个类的属性,比如下面的程序中,将Main_food
类作为Restaurant
类的main_food
属性:
class Main_food ():
"""主营食品的基本描述"""
def __init__ (self, main_food):
self.name = main_food['name']
self.price = main_food['price']
self.review = main_food['review']
def print_food (self):
print ("食品: \t %s(%f):%s" % (self.name, self.price, self.review))
class Restaurant ():
"""一个饭店的基本信息"""
def __init__(self, name, main_food, phone, address):
self.name = name
self.main_food = Main_food(main_food) # 将类作为属性
self.phone = phone
self.address = address
self.slogen = '欢迎来本店吃饭!'
def print_info (self):
print ("名字: \t " + self.name)
print ("=====================")
self.main_food.print_food() # 调用作为属性的类
print ("联络: \t " + self.phone)
print ("地址: \t " + self.address)
print (self.slogen)
def set_slogen (self, slogen):
self.slogen = slogen
我们先定义了一个类Main_food
,它代表着主营食品,它接受一个字典作为参数,并有一个显示食品基本信息的方法print_food()
。
在类Restaurant
中,将属性main_food
指向类Main_food
。随后即可直接调用此属性,比如在print_info()
方法中,self.main_food.print_food()
表示调用属性main_food
(其实指向Main_food
类)的print_food()
方法。
执行下面的程序:
bxq_offal_food_des = {'name':'卤煮', 'price':25, 'review':'昨天吃了两碗卤煮觉得学习更棒了!'}
bxq_offal = Restaurant ('北新桥卤煮', bxq_offal_food_des, '010-84015365', '东四北大街141号(近如家北新桥店)')
bxq_offal.print_info()
得到的结果如下:
名字: 北新桥卤煮
=====================
食品: 卤煮(25.000000):昨天吃了两碗卤煮觉得学习更棒了!
联络: 010-84015365
地址: 东四北大街141号(近如家北新桥店)
欢迎来本店吃饭!