如何将对象实例移动到另一个类?

时间:2019-02-06 21:57:16

标签: python oop

基本上,我想拥有两个类TradesHistoricalTrades。第二个将是第一个具有多个属性的副本。在Trades上获得副本后,HistoricalTrades实例将被删除

我已经通过手动传递属性解决了这个问题。

class Trades:
    ...

class HistoricalTrades:
    ...

k = Trades(price=123, amount=10)
h = HistoricalTrades(price=k.price, amount=k.amount, sell_date=k.sell_date)
k.delete()

有点像预期的效果,但我感觉它并不优雅。还有其他(更好)的方法可以将类实例移动到其他类吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下,假设不使用__slots__,并且实际上使用的三个属性是Trade的唯一属性,那么您可以逃避一点小作弊,并进行以下更改:

h = HistoricalTrades(price=k.price, amount=k.amount, sell_date=k.sell_date)

收件人:

h = HistoricalTrades(**vars(k))

vars(k) returns the __dict__ of k itself,然后我们用**解包到名称/值对中作为关键字参数来初始化HistoricalTrades

该解决方案有点笨拙(如前所述,它取决于不使用__slots__并且不具有任何其他属性)。确实,执行此操作的一种好方法是为HistoricalTrades定义一个替代构造函数,该构造函数为您执行slog,从而简化了调用方的使用:

class HistoricalTrades:
    ...
    @classmethod
    def from_trade(cls, trade):
        return cls(price=trade.price, amount=trade.amount, sell_date=trade.sell_date)

是的,它是相同的代码,但是只编写了一次,每个呼叫站点都可以简化为:

h = HistoricalTrades.from_trade(k)

这是简洁的自记录文件。

答案 1 :(得分:0)

继承在这里听起来很有用:

class Trades:
    ...

class HistoricalTrades(Trades): # This will make HistoricalTrades inherit characteristics from Trades
    ...

h = HistoricalTrades(price=123, amount=10, sell_date="Some data not provided")

但是我认为我们需要更多信息才能为您提供更合适的答案...