python类(二)

编写类时,并不一定都是从空白开始。一个类也可以继承另一个类。

本文目录

  • 1 继承
  • 2 将类作为属性

继承

首先编写一个表示饭店基本信息的类:

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_shopset_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号(近如家北新桥店)
欢迎来本店吃饭!

原文发布于微信公众号 - mwangblog(mwangblog)

原文发表时间:2018-04-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禁心尽力

反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射

简单粗暴,直奔主题。 需求:通过自定义注解和反射技术,将Excel文件中的数据自动映射到pojo类中,最终返回一个List<pojo>集合?   今天我只是通...

4559
来自专栏云时之间

数据结构(三):栈与队列

3.1❶若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答: ? (1) 如果进站的车厢序列为123,则可能...

3607
来自专栏小樱的经验随笔

Codeforces Round #395 (Div. 2)(A.思维,B,水)

A. Taymyr is calling you time limit per test:1 second memory limit per test:256 ...

2976
来自专栏程序员互动联盟

【答疑释惑】ascii码及转义字符的含义

我们在c/c++学习开发中经常用到它,小伙伴们你们都知道那些,是不是用到的时候着急或者不知道,为什么判断字符串结尾是'\0'呢?   我们就讲讲列列ascii...

3365
来自专栏java架构师

Stream篇(1)

最近在看一个写的很好的博客,为了加深记忆,把自认为重要的东西,一边看,一边记在这里 一、什么是流、字节序列、字节 一条河中有一条鱼游过,这条鱼就是一个字节,这个...

2957
来自专栏菩提树下的杨过

温故而知新:c#中的特性(attribute)

特性(Attribute)是微软在.Net中自创的一种新技术,对于很多初学者来讲,特性一直是一块难啃的骨头。 既然弄不懂,那我们就暂时绕过它吧,回想一下我们在写...

1919
来自专栏菩提树下的杨过

重温delphi之控制台程序:Hello World!

这二天用c#开发ActiveX时,发现不管怎么弄,c#就是没办法生成ocx的纯正activeX控件,而且还要强迫用户安装巨大的.net framework(我只...

2098
来自专栏Albert陈凯

Hadoop数据分析平台实战——260用户数据ETL离线数据分析平台实战——260用户数据ETL

离线数据分析平台实战——260用户数据ETL ETL目标 解析我们收集的日志数据,将解析后的数据保存到hbase中。 这里选择hbase来存储数据的主要原因就...

4926
来自专栏积累沉淀

初识HtmlParser

1、概念 网页解析,即程序自动分析网页内容、获取信息,从而进一步处理信息。 htmlparser包提供方便、简洁的处理html文件的方法,它将html页面中...

2115
来自专栏木宛城主

SharePoint CAML In Action——Part II

在SharePoint中,相对于Linq to SharePoint而言,CAML是轻量化的。当然缺点也是显而易见的,"Hard Code"有时会让你抓狂。在实...

1915

扫码关注云+社区