基本上,我想拥有两个类Trades
和HistoricalTrades
。第二个将是第一个具有多个属性的副本。在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()
有点像预期的效果,但我感觉它并不优雅。还有其他(更好)的方法可以将类实例移动到其他类吗?
答案 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")
但是我认为我们需要更多信息才能为您提供更合适的答案...