文档章节

python 面向对象设计

lcgsmile
 lcgsmile
发布于 2017/04/11 13:51
字数 608
阅读 3
收藏 0

从函数引出面向对象设计:

举这样一个例子:

歌手唱歌 :

singer1={
        'name':'王菲',
        'gender':'女',
        'type':'歌手',}

def singing(singer):
    print('[%s]正在唱歌'% singer['name'])

singing(singer1)

  

输出:_ [王菲]正在唱歌_

那么问题来了 ,我定义一个死人

dead={
    'name':'某死人',
    'gender':'男',
    'type':'死人'
}
singing(dead)

输出了:[某死人]正在唱歌

卧槽!卧槽! 诈尸了!

我可能要加个判断:

def singing(singer):
    if singer['type']=='歌手':
        print('[%s]正在唱歌'% singer['name'])
    else:
        pass

看似完美,那我要是想让歌手跳舞呢? 还得来一次判断

def dance(singer):
    if singer['type']=='歌手':
        print('[%s]正在跳舞'%singer['name'])
    else:
        pass

每加一个方法,就要判断一次,歌手可能有很多方法,可见这样一直的重复代码并不完美。

我们可以将歌手和他的方法绑定在一起。

def singers():
    def singing(singer):
        print('[%s]正在唱歌'% singer['name'])
    def dance(singer):
        print('[%s]正在跳舞'%singer['name'])
    singer1={
        'name':'王菲',
        'gender':'女',
        'type':'歌手',
        'singing':singing,
        'dance':dance,
         }
    return singer1

运行一下

s1=singers()
print(s1)         # 返回绑定后的字典
s1['singing'](s1)   # 自身作为参数传入函数 si['singing]()

 --->

_{'type': '歌手', 'dance': <function singers.<locals>.dance at 0x0000016524FF0268>, 'name': '王菲', 'gender': '女', 'singing': <function singers.<locals>.singing at 0x0000016524FF01E0>}

[王菲]正在唱歌_   

问题解决了,但是我又有 需求了,我想听李健唱歌怎么办? 只需要把参数传进去:

def singers(name,gender,type):
    def singing(singer):
        print('[%s]正在唱歌'% singer['name'])
    def dance(singer):
        print('[%s]正在跳舞'%singer['name'])
    singer1={
        'name':name,
        'gender':gender,
        'type':type,
        'singing':singing,
        'dance':dance,
         }
    return singer1

s1=singers('李健','男','歌手')
s1['singing'](s1)

输出:[李健]正在唱歌

继续优化:

def singers(name,gender,type):    
    def singing(singer):
        print('[%s]正在唱歌'% singer['name'])
    def dance(singer):
        print('[%s]正在跳舞'%singer['name'])
    def init(name,gender,tupe):          
        singer1={
        'name':name,
        'gender':gender,
        'type':type,
        'singing':singing,
        'dance':dance,
               }
        return singer1
    return init(name,gender,type)

s1=singers('李健','男','歌手')    
s1['singing'](s1)

把一类相同动作熟悉特征的事物整合到一起,统称为类,而对象是类的一个实例。即鲤鱼是鱼类的一个实例对象,李健,王菲都是歌手的一个实例对象。

面向对象编程实际上是用定义类 +实例对象的方式去实现面向对象设计。

class Singers:
    def __init__(self,name,gender,type):
        self.name=name
        self.gender=gender
        self.type=type
    def singing(self):
        print('[%s]正在唱歌'% self.name)
    def dance(self):
        print('[%s]正在跳舞'%self.name)
        
s1=Singers('李健','男','歌手')
s1.singing()

输出:[李健]正在唱歌

© 著作权归作者所有

共有 人打赏支持
上一篇: form上传文件
下一篇: form上传文件
lcgsmile
粉丝 0
博文 2
码字总数 741
作品 0
昌平
私信 提问
Python 3 面向对象编程(第3版) 中英文Python 3 Object-Oriented Programming 3rd Edition - 2018.pdf

python测试开发项目实战-目录 python工具书籍下载-持续更新 python 3.7极速入门教程 - 目录 第2版 中文 介绍 本书主要介绍如何使用Python 3进行面向对象编程。1~4章介绍面向对象这一编程范式...

python测试开发人工智能安全
02/12
0
0
不要用面向对象编程分散新手程序员的注意力

来源:Ackalrix博客【http://www.ackarlix.com】 编者按:原文作者James Hague是一位修复性程序员(recovering programmer),从上世纪80年代起开始设计视频游戏,属于发烧友级别,用汇编语言...

Ackarlix
2011/03/30
293
1
python异常处理和面向对象编程总结

异常处理和面向对象编程,是python编程中,比较重要的基础。在实际生产编程设计和开发中,异常处理和面向读象都是必须在设计和开发过程中充分考虑的。 对于python开发和面向对象这两部分基础...

yumushui991
2018/06/26
0
0
Python零基础入门(安装步骤,验证方式, 简单操作)

本篇文章适合新人小白初步了解Python,涵盖Python的介绍、安装以及简单的基础操作。 1.Python简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。它的设计具有很...

晓先生不会喝酒
04/17
0
0
Python是面向对象的语言吗?python编程

  Python虽然是解释型语言,但从设计之初就已经是一门面向对象的语言,对于Python来说一切皆为对象。正因为如此,在Python中创建一个类和对象是很容易的,当然如果习惯面向过程或者函数的写...

老男孩Linux培训
2018/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

生产者消费者问题(PV操作)

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减...

shzwork
7分钟前
0
0
重新认识网络通信协议

OSI网络分层 应用层 http, smtp,pop3这些都属于应用层协议 为用户的应用程序提供服务 表示层 确保一个系统的应用层发送的信息被另一个系统的应用层接收到 会话层 通过传输层建立数据传输的通...

最胖的瘦子
18分钟前
0
0
【转】分布式数据流的轻量级异步快照

本篇翻译自论文:Lightweight Asynchronous Snapshots for Distributed Dataflows,Flink的容错快照模型即来源于该论文。原文地址:https://arxiv.org/pdf/1506.08603.pdf 分布式数据流的轻量...

yiduwangkai
20分钟前
0
0
java使用反射机制设置私有成员变量的值

写一个方法:public void setProperty(Objectobj, String propertyName, Object value){}, 此方法可将obj对象中名为propertyName的属性的值设置为value。(这里不知道obj对象的propertyNam...

群星纪元
26分钟前
0
0
用 Tapestry 的方式在页面模板中加入注释

<span jwcid="$remove$">这里是注释</span>

LeoXu
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部