设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 523|回复: 0
收起左侧

Python基础|类(六)

[复制链接]
发表于 2018-3-1 12:18:57 | 显示全部楼层 |阅读模式
本帖最后由 yeslab官方 于 2018-3-1 12:21 编辑

接上回说:
概要
安装环境
变量
布尔、数字、字符串
列表
文件与异常(一)
文件与异常(二)
文件与异常(三)
类(一)
类(二)
类(三)
类(四)
类(五)


    ★ 特殊方法
    到目前为止,你已经能创建并使用基本对象了。现在再往深钻研一些。
    当我们输入像 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 函数…… 内置数据类型是你最好的朋友。尽可能多地使用数字、字符串、元组、列表、集合以及字典。多看看容器库提供的类型,尤其是双端队列。

                               
登录/注册后可看大图



您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-4-25 17:27 , Processed in 0.203093 second(s), 8 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表