机器人课程
我们教程的这一章旨在加深读者对前一章中建立的多重继承的理解。我们将为 Python 编程语言的这一重要的面向对象原则提供进一步的扩展示例。我们将使用 Robot 类的变体作为超类。我们还将使用 Python 之类的属性总结面向对象的其他一些重要方面。我们还将找出覆盖、重载和覆盖之间的区别。
这个例子是在我的现场 Python 培训课程中成长起来的,因为我迫切需要简单易懂的子类化例子,最重要的是一个用于多重继承的例子。
从超类开始,Robot
我们将派生出两个类:一个FightingRobot
类和一个NursingRobot
类。
最后,我们将定义FightingRobot
类和NursingRobot
类的“组合” ,即我们将实现一个类FightingNurseRobot
,它将继承自FightingRobot
和NursingRobot
。
让我们从我们的Robot
类开始:我们使用一个私有类属性,__illegal_names
其中包含一组不允许用于命名机器人的名称。
通过提供一种__add__
方法,我们确保我们的机器人能够传播。将自动创建生成的机器人的名称。“婴儿”机器人的名字将由父母双方的名字串联而成,中间用连字符分隔。如果父名称的名称包含连字符,我们将仅使用连字符之前的第一部分。
机器人将使用 0 到 1 之间的随机值来“激活”属性health_level
。如果机器人的健康级别低于由类属性定义的阈值Robot.__crucial_health_level
,则它将需要来自NursingClass
. 为了确定机器人是否需要治疗,我们提供了一种方法needs_a_nurse
,如果该值低于该值则返回 True Robot.__crucial_health_level
,否则返回False。
随机导入
类 机器人():
__illegal_names = { “亨利” , “奥斯卡” }
__crucial_health_level = 0.6
def __init__ ( self , name ):
self 。name = name #---> 属性设置器
self 。health_level = 随机。随机()
@property
def name ( self ):
返回 self 。__名称
@名称。setter
def name ( self , name ):
如果 名称 在 Robot 中。__illegal_names :
自我。__name = "Marvin"
else :
self . __name = 名字
def __str__ ( self ):
返回 self 。名称 + ", 机器人"
def __add__ ( self , other ):
first = self 。名字。拆分(“-” )[ 0 ]
秒 = 其他。名字。split ( "-" )[ 0 ]
返回 机器人(第一个 + "-" + 第二个)
def need_a_nurse ( self ):
如果 self . health_level < 机器人。__crucial_health_level :
返回 真
否则:
返回 假
高清 say_hi (个体经营):
打印(“你好,我是” + 自我。名称)
打印(“我的健康水平是:” + STR (自我。health_level ))
我们现在可以测试新设计的Robot
类。注意连字符名称如何代代变化:
first_generation = (机器人(“Marvin” ),
机器人(“Enigma-Alan” ),
机器人(“Charles-Henry” ))
gen1 = first_generation # 用作缩写
婴儿 = [ gen1 [ 0 ] + gen1 [ 1 ], gen1 [ 1 ] + gen1 [ 2 ]]
婴儿