如果我正在编写代码
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的值也会改变。(我计划有多个机器人,因此需要基类)
答案 0 :(得分:3)
最明显的方法是在创建新对象时从现有对象中获取所需的属性:
duck = DuckRobot(r.room, r.position)
但这涉及很多&#34;重复自己&#34;随着参数数量的增加,变得越来越麻烦。有更好的方法,例如:
__init__()
也接受另一个Robot
实例,并从该实例中提取新对象所需的值。from_robot()
接受另一个实例,并从中提取必要的值。在这三种方法中,更改__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
属性用于其他目的,那么您也可以重复使用它。