《 Python的工作原理》一书。 开发人员,程序员和感兴趣的人的指南”

图片 你好habrozhiteli! 我们最近发布了一本有关Python的新书。 我们提供您立即使您熟悉事实调查材料。

摘录。 7.4。 使用IDLE


由于IDLE包含REPL,因此您可以输入上面的代码,然后直接在REPL中对其进行解析。 但是,您也可以编写代码,运行它并从REPL中解析它。 要尝试此功能,请打开一个新文件,并在其中包含以下代码:

name = "Matt" first = name age = 1000 print(id(age)) age = age + 1 print(id(age)) names = [] print(id(names)) names.append("Fred") print(id(names)) 

将代码保存在名为iden.py的文件中。 运行文件。 在“ IDLE”中,按F5键。 REPL中将显示四个数字。 前两个会有所不同; 这表明整数是不可变的。 最后两个数字相同。 这是因为尽管更改了名称列表,但标识符保持不变。 总的来说,这个事实根本不是什么新鲜事物。

现在最有趣的事情是:如果在REPL中输入dir()命令,它将显示变量列表。 您将看到iden.py的全局变量现在可用。

IDLE中的REPL提供对所有全局变量的访问。 您可以查找名称和名称,甚至可以调用函数或方法-例如,names.append(“ George”)。

有机会研究刚刚执行的代码的结果,您可以快速分析代码并进行试验。 经验丰富的Python开发人员经常在REPL中编写代码,将其粘贴到文件中,再次运行该文件,在REPL中编写新代码,然后继续以这种方式编写代码。

图片

图片

图片

摘录。 22.子类化


除了对状态和操作进行分组之外,类还提供代码重用。 如果您已经有一个类,并且需要另一个行为稍有不同的类,则重用的一种方法是子类化。 从中执行子类化的类称为超类(超类的另一个通用名称是父类)。

假设您要创建一个可容纳六个滑雪者的椅子。 若要创建Chair6类(可模拟六人使用的椅子),这是Chair的更专业版本,则可以使用子类。 子类允许程序员继承父类的方法,并覆盖需要更改的方法。

以下是Chair6类,它是CorrectChair的子类:

 >>> class Chair6(CorrectChair): ... max_occupants = 6 

注意:CorrectChair的父类在类名后的括号中。 请注意,Chair6并未在其主体中定义构造函数,但是您可以创建该类的实例:

 >>> sixer = Chair6(76) 

如果在类中未定义构造函数,Python如何创建对象? 这就是发生的情况:当Python搜索.__ init__方法时,搜索从Chair6开始。 由于Chair6类仅包含max_occupants属性,因此Python在此处找不到.__ init__方法。 但是由于Chair6是CorrectChair的子类,因此它具有__bases__属性,列出了元组中总结的基类:

图片

图片

 >>> Chair6.__bases__ (__main__.CorrectChair,) 

然后,Python在基类中搜索构造函数。 他在CorrectChair中找到了构造函数,并使用它来创建一个新类。

当为实例调用.load时,会进行相同的搜索。 实例没有与方法名称相对应的属性,因此Python检查实例类。 Chair6也没有.load方法,因此Python会在CorrectChair基类中查找属性。 在此,使用太大的值调用.load方法,从而导致ValueError错误:

 >>> sixer.load(7) Traceback (most recent call last): File "/tmp/chair.py", line 30, in <module> sixer.load(7) File "/tmp/chair.py", line 13, in load new_val = self._check(self.count + number) File "/tmp/chair.py", line 23, in _check number)) ValueError: Invalid count:7 

Python在基类中找到该方法,但是调用._check方法会导致ValueError错误。

22.1 计数停靠点


有时,滑雪者未能正确登上电梯。 在这种情况下,操作员会放慢速度或停止升降机以帮助滑雪者。 我们可以使用Python创建一个新类,该类将计算此类停靠点的数量。

假定对.load的每次调用都调用一个函数,该函数返回停止是否发生的逻辑指示。 在功能参数中,传送滑雪者和椅子对象的数量。

以下是在构造函数中获取is_stalled函数的类。 每次调用.load时都会调用此函数:

 >>> class StallChair(CorrectChair): ... def __init__(self, id, is_stalled): ... super().__init__(id) ... self.is_stalled = is_stalled ... self.stalls = 0 ... ... def load(self, number): ... if self.is_stalled(number, self): ... self.stalls += 1 ... super().load(number) 

要创建此类的实例,必须提供is_stalled函数。 以下简单函数在10%的情况下会生成停止:

 >>> import random >>> def ten_percent(number, chair): ... """Return True 10% of time""" ... return random.random() < .1 

现在,您可以通过将ten_percent函数指定为is_stalled参数来创建实例:

 >>> stall42 = StallChair(42, ten_percent) 

22.2。 超级


回想一下,StallChair定义了自己的.__ init__方法,该方法在创建实例时调用。 注意:构造函数的第一行如下所示:

 super().__init__(id) 

在方法内部调用super时,您可以访问正确的父类。

构造函数中的一行允许您调用CorrectChair构造函数。 您可以使用父类中的逻辑,而不必重复分配id和count属性的逻辑。 由于StallChair具有必须为实例设置的其他属性,因此可以在调用父构造函数之后完成。

图片

.load方法还包含对super的调用:

 def load(self, number): if self.is_stalled(number, self): self.stalls += 1 super().load(number) 

在.load方法中,调用is_stalled函数以确定升降机是否已停止,然后使用super从CorrectChair转移对原始.load功能的控制。

将通用代码放在一个位置(在基类中)可以减少错误和重复代码的数量。

关于作者


Matt Harrison自2000年以来一直使用Python。 他领导MetaSnake,一家从事Python和数据分析理论的咨询和企业培训公司。 过去,他从事研究,组装和测试管理,商业智能和数据存储等领域的工作。

他在Strata,SciPy,SCALE,PyCON和OSCON等会议以及本地用户会议上作了演讲和培训讲座。 本书的结构和材料基于他在Python教学中的实践经验。 Matt会定期在Twitter(@__mharrison__)上发布有用的Python相关信息。

科学编辑


罗杰·戴维森Roger A. Davidson )目前是加利福尼亚州萨克拉曼多市美国河学院数学系主任。 他的博士论文是关于航空航天工程的,但他还拥有计算机科学,电气和系统工程教育文凭,并且最近还获得了数据科学证书(这开始了他对Python的热情)。 在他的整个职业生涯中,Roger在NASA,财富50强公司,初创公司和社区大学工作。 他热衷于教育,科学(不仅是数据处理),黑莓派以及异类团队在解决重大问题方面的领导能力。

安德鲁·麦克劳克林(AndrewMcLaughlin) –程序员和设计师,早上是系统管理员,下午是一个有家室的人。 由于对细节的关注,他从1998年开始从事网络编程。 安德鲁(George Fox)获得乔治福克斯大学荣誉奖,他拥有管理和信息系统学位。 闲暇时,他与妻子和两个孩子一起去露营,有时还在木工车间里工作(所有手指都还留在原地)。 阅读他的Twitter帖子:@amclaughlin。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录

对于Habrozhitelami,可使用优惠券-Python享受20%的折扣。

Source: https://habr.com/ru/post/zh-CN433534/


All Articles