轻松将超类传递给子类

时间:2018-02-14 16:32:10

标签: python

如果我正在编写代码

Robot

现在,如果我已经创建r=Robot('My',5)作为DuckRobot并希望duck=DuckRobot(r)继承所有参数,我该怎么做?简单地DuckRobot不起作用。如果从 <Window.Resources> <ResourceDictionary> <Style TargetType="{x:Type Image}" x:Key="ImageStatusStyle"> <Setter Property="Visibility" Value="Hidden" /> <Setter Property="Source" Value="pack://application:,,,/Resources/MyIcon.ico"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=RowData.Row.ShowImage, UpdateSourceTrigger=PropertyChanged}" Value="true"> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> </Style.Triggers> </Style> </ResourceDictionary> </Window.Resources> <grid:MyDevXpfGrid x:Name="gridResult" ItemsSource="{Binding MyDetails}" Height="Auto" Width="Auto" MaxHeight="1000" AutoGenerateColumns="AddNew" AutoGeneratingColumn="gridResult_AutoGeneratingColumn" Margin="0"> 更改值,则r中self.position的值也会改变。(我计划有多个机器人,因此需要基类)

1 个答案:

答案 0 :(得分:3)

最明显的方法是在创建新对象时从现有对象中获取所需的属性:

duck = DuckRobot(r.room, r.position)

但这涉及很多&#34;重复自己&#34;随着参数数量的增加,变得越来越麻烦。有更好的方法,例如:

  1. __init__()也接受另一个Robot实例,并从该实例中提取新对象所需的值。
  2. 编写一个名为eg的类方法from_robot()接受另一个实例,并从中提取必要的值。
  3. 编写一个方法,返回构造新实例的显着属性,并在构造时传递它们。
  4. 在这三种方法中,更改__init__()几乎是最糟糕的选择,因为您需要接受两组不同的值。这意味着你必须使所有参数都是可选的,并添加代码以确保传递有效的组合。所以我们会跳过这个。 (您可以使用functools.singledispatch()来编写这些变体,但该功能仅在Python 3.4中添加,并且无论如何它似乎都有点过分。)

    这里是类方法......方法:

    class Robot(object):
    
        def __init__(self, room, position):
            self.position=position
            self.room=room
            self.direction=random.randrange(0,360)
    
        @classmethod
        def from_robot(cls, robot):
            return cls(robot.room, robot.position)
    

    现在,您可以使用以下内容从现有DuckRobot实例Robot构建r

    duck = DuckRobot.from_robot(r)
    

    最后,在这里,&#34;返回显着属性&#34;方法。我们在这里使用了一处房产,因此您无需致电:

    class Robot(object):
    
        def __init__(self, room, position):
            self.position=position
            self.room=room
            self.direction=random.randrange(0,360)
    
        @property
        def attributes(self):
            return self.room, self.position
    

    然后您可以像DuckRobot那样创建一个新的r

    duck = DuckRobot(*r.attributes)
    

    我个人更喜欢类方法选项(替代构造函数几乎是类方法的第一用例),并且大多数Python程序员都具有相同的首选项。但是,如果您已经想要将attributes属性用于其他目的,那么您也可以重复使用它。