让我们考虑Human
课程。要实现它,第一种方法是让一个类包括所有方法:
class Human:
@property
def height(self):
return self._height
@property
def weight(self):
return self._weight
def LeftArm_Hand_Thumb_Bend(angle):
pass
此解决方案很简单,但如果方法的数量非常大,则可能会造成混淆。
第二种方法将人体功能分为子类。这些子类位于同一模块中,并将在创建人类对象时进行实例化:
class Human:
@property
def height(self):
return self._height
@property
def weight(self):
return self._weight
def __init__(self):
self.arms = (
__HumanArm(self),
__HumanArm(self),
)
class __HumanArm:
def __init__(self):
self.hand = __HumanHand(self)
...
这比第一个解决方案略好,但需要更多复杂性。编写人机界面将更加样板。
我们也可以想到一种类似的方法,其中子类位于人类内。虽然通常不建议使用内部子类,但这提供了更好的组织。
class Human:
@property
def height(self):
return self._height
@property
def weight(self):
return self._weight
def __init__(self):
self.arms = self.__Arms(self)
class __Arms:
def __init__(self):
self.left = __Arm(self)
class __Arm:
def MoveThumb(): pass
...
在我看来,由于自动完成即 IPython,最后的解决方案在交互式终端中更容易使用:
lucy = Human(name = 'Lucy')
lucy.arms.left.thumb.move()
由于Python中没有真正可用的分层集合(字典不允许使用.
完成),我试图使用类找到一个技巧。
所以问题是我应该如何组织我的人类课程?我不知道使用我在构造函数中实例化的本地双下划线类是否是一个好习惯,方法是将当前实例传递给它。
我不想将Hand
课程放在Human
课程之外,因为这是一只人手并且它总是附着在身体上。而且,没有活体人体,不可能实例化人手。
对于那些需要更具体应用的人来说,让我们简单地认为这个人类是一个主要用于终端与人形机器人交互的界面。每种方法都更少地与通过以太网与机器人通信的低级C函数相关联。
考虑到最后一段,我宁愿选择这个:
>>> bob = Humanoid(ip='192.168.68.2', port=3699)
>>> bob.PowerOn()
>>> bob.serial_number
4832927
>>> bob.arm<tab>
left right
>>> bob.arm.left.Move(30, speed=50)
>>> image = bob.eyes.left.GetImage()
比这个
>>> bob = Humanoid(ip='192.168.68.2', port=3699)
>>> bob.PowerOn()
>>> bob.serial_number
4832927
>>> bob_arm = bob.GetArm(0)
>>> bob_arm.Move(30, speed=50)
>>> bob_left_eye = bob.GetEye(0)
>>> image = bob_left_eye.GetImage()
总之,我更关注collection
个动作,而不是真正的面向对象的体系结构。