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

2024-10-01 09:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我想要两个类TradesHistoricalTrades。第二个将是第一个的副本,并且没有更多的属性。在HistoricalTrades上获取副本后,Trades实例将被删除

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

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()

它有点像预期的那样工作,但我觉得它不优雅。是否有其他(更好的)方法将类实例移动到其他类


Tags: 实例方法date属性副本手动tradesdelete
2条回答

对于这种特定情况,假设不使用__slots__,并且所使用的三个属性实际上是Trade的唯一属性,您可以通过一个小欺骗来逃脱,更改:

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

致:

h = HistoricalTrades(**vars(k))

^{} returns the ^{} of ^{} itself,然后使用**将其解包到名称/值对中,作为要初始化HistoricalTrades的关键字参数

该解决方案有点笨拙(如前所述,它取决于不使用__slots__并且不具有任何其他属性)。实际上,实现这一点的好方法是为HistoricalTrades定义一个替代构造函数,它可以为您完成这项工作,从而简化调用者的使用:

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)

既简洁又能自我记录

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

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")

但我认为我们需要更多的信息来为您提供更合适的答案

相关问题 更多 >