python中的函数数不胜数,是我们学习python的重要模块之一。作为python的另一个模块,class并不逊色于function。春季和秋季两者平分秋色,选择哪一款就看各位朋友的使用情况了。为了让大家明白两者在用法上的区别,小编特意找了一个例子,方便大家在对比中选择更合适的用法。让我们看一个例子。
假设我们需要写一个音乐播放器。在这个播放器中,我们有关于不同类型数据的信息,例如歌曲、专辑、艺术家和播放列表。还有播放歌曲、播放专辑、播放艺术家或播放播放列表的功能。我们将每一种数据存储在一个字典中,不同类型的数据有不同的字段名,因为每个播放函数需要做的事情不同,所以我们有四个不同的函数:
some_song = {
"title": "Yellow Submarine",
"artist": the_beatles, # 指向到包含该艺术家的词典
"album": yellow_submarine_album, # 指向包含此相册的dict的链接
"duration": insert_time_object_here,
"filepath": "path/to/file/on/disk"
}
# 其他数据类型的结构也类似
# 一些函数
def play_song(song):
# 获取歌的路径
path = song["filepath"]
# 播放路径
call_some_library_function(path)
def play_album(album):
# 找到专辑里所有的歌曲
# 分别调用play_song
def play_artist(artist):
# 找到这位艺术家所有的专辑
# 分别调用play_album
def play_playlist(playlist):
# 找到播放列表中的所有歌曲
# 分别调用play_song
这样写有什么不好?
我们有四个非常相似的函数,每个函数都与特定类型的数据相关。你必须把它们叫做不同的东西,而不仅仅是play,你必须确保你把正确的数据传递给它们。虽然这四种不同的类型都可以“播放”,但是没有一种通用的方法可以在不知道它是什么的情况下播放任何东西。那么在OOP下,怎么实现呢:
class Song:
def __init__(self, title, artist, album, duration, filepath):
self.title = title
self.artist = artist
self.album = album
self.duration = duration
self.filepath = filepath
def play(self):
path = self.filepath
call_some_library_function(path)
这定义了如何创建一个新的 Song 对象。该方法将字段值作为参数并将它们分配为对象的属性。 self 是一个特殊的参数(名称不是保留的;它可以被称为任何东西),它是对对象本身的引用。是一种从同一对象的其他方法中访问属性和方法的方法。当我们从对象外部访问它们时(当我们想使用 play 方法时我们会这样做),那么我们可以使用在该范围内为对象指定的任何名称。
那么在之前:
# some_song是上面定义的歌
play_song(some_song)
在使用class之后:
# self参数没有在这里传递;它会自动添加
some_song = Song("Yellow Submarine",
the_beatles,
yellow_submarine_album,
insert_time_object_here,
"path/to/file/on/disk"
)
some_song.play()
为什么这样更好?
如果我们有一个对象,则不必知道它是什么就可以播放,因为现在播放任何内容的语法都是相同的:anyobject.play()即对象“知道”如何使用“自己的”数据进行处理的设计思想。无需从外部检查对象是否具有某些字段并决定如何处理这些内部字段,而是调用play对象提供的方法,并在每个类内部定义该类型的对象应如何实现此功能。
以上就是类和函数的使用对比。肯定有小伙伴说,小编偏向于类。其实这只是应用场景的选择,大家不用担心。选择合适的才是最重要的。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python不是内部或外部命令发生了什么08/21
- ♥ Windows安装Python详解01/06
- ♥ python可以重写方法吗12/24
- ♥ 如何退出在python中运行的程序?10/17
- ♥ 什么类型的python对象是08/24
- ♥ 安装后如何运行python11/01
内容反馈