首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python基础 类(六)

特殊方法

到目前为止,你已经能创建并使用基本对象了。现在再往深钻研一些。

当我们输入像 a = 3 + 8 这样的表达式时,整数 3 和 8 怎么知道如何实现 + 的? 同样, a 又是怎么知道如何使用 = 来获取计算结果的? 你可以使用 Python 的特殊方法(special method),有时魔术方法(magic method), 来实现这些操作符的功能。别担心,它们一点也不复杂。

这些特殊的方法的名称以双下划线()开头和结束。没错,你已经见过其中一个:

`init__`,它根据类的定义以及传入的参数对新创建的对象进行初始化。

假设你有一个简单的 Word 类,现在想要添加一个 equals() 方法来比较两个词是否一致,忽略大小写。也就是说,一个包含值 ‘ha’ 的 Word 对象与包含 ‘HA’ 的是相同的。

下面的代码是第一次尝试,创建一个普通方法 equals()。self.text 是当前 Word 对象所包含的字符串文本,equals() 方法将该字符串与 words (另一个 Word 对象)所包含的字符串做比较:

接着创建三个包含不通字符串的 Word 对象:

当字符串 ‘ha’ 和 ‘HA’ 被转换为小写形式再进行比较时(我们就是这么做的),他们应该是相等的:

但字符串 ‘eh’ 无论如何与 ‘ha’也不会相等:

我们成功定义了 equals() 方法进行小写转换并比较。但试想一下,如果能通过 if first == second 进行比较的话岂不更妙?这样类会更自然,表现得更像一个 Python 内置的类。 好的,我们来试一下,把前面例子中的 equals() 方法的名称改为 eq() :

修改就此结束,来看看新的版本能否正常工作:

太神奇了!是不是如同魔术一般?仅需将方法名改为 Python 里进行相等比较的特殊方法名 eq() 即可。下面列出一些常用的魔术方法:

和比较相关的魔术方法

和数学相关的魔术方法

除了init() 外,你会发现在编写类方法时最常用到的是str(),他用于定义如何打印对象信息。print() 方法,str() 方法以及一些字符串格式化的相关方法都会用到str()。交互式解释器则用repr() 方法输出变量。如果在你的类既没有定义str() 也没有定义repr(), Python会输出类似下面这样的默认字符串:

我们将str() 和repr() 方法都添加到 Word 类里,让输出的对象信息变得更好看些:

组合

如果你想要创建的子类在大多数情况下的行为都和父类相似的话,使用继承是非常不错的选择,建立复杂的继承关系确实很吸引人,但有些时候使用组合(composition)或者聚合(aggregation)更加符合现实的逻辑。一只鸭子是鸟的一种,它有一条尾巴。尾巴并不是鸭子的一种,它是鸭子的组成部分。

何时使用类和对象而不是模块

有一些方法可以帮助你决定是把你的代码封装到类里还是模块里。

当你需要许多具有相似行为(方法)但不同状态(特性)的实例时,使用对象是最好的选择。

类支持继承,但模块不支持。

如果你想要保证实例的唯一性,使用模块是最好的选择。不管模块在程序中被引用多少次,始终只有一个实例被加载(单例)。

如果你有一系列包含多个值的变量,并且它们能作为参数传入不同的函数,那么最好将它们封装到类里面。举个例子,你可能会使用以 size 和 color 为键的字典代表一张彩色图片。你可以在程序中为每张图片创建不同的字典,并把它们作为参数传递给像 scale() 或者 transform() 之类的函数。但这么做的话,一但你想要添加其他的键或者函数会变得非常麻烦。为了确保统一性,应该定义一个 Image 类,把 size 和 color 作为特性,把 scale() 和 transform 定义为方法。这么一来,关于一张图片的所有数据和可执行的操作都存储在了统一的位置。

用最简单的方式解决问题。使用字典、列表和元组往往要比使用模块更加简单、简洁且快速。而使用类则更为复杂。

创始人 Guido 的建议:

不要过度构建数据结构。尽量使用元组(以及命名元组)而不是对象。尽量使用简单的属性域儿不是getter/setter 函数…… 内置数据类型是你最好的朋友。尽可能多地使用数字、字符串、元组、列表、集合以及字典。多看看容器库提供的类型,尤其是双端队列。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180227G13IUX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券