Как переместить экземпляр объекта в другой класс? - PullRequest
0 голосов
/ 07 февраля 2019

В основном я хочу иметь два класса 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()

Это вроде работает, как и ожидалось, но я чувствую, что это такне элегантноЕсть ли другой (лучший) способ переместить экземпляр класса в другой класс?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Для этого конкретного случая, при условии, что __slots__ не используется, и что три используемых атрибута на самом деле являются единственными атрибутами Trade, вы можете сойти с рук с небольшим обманом, изменив:

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

to:

h = HistoricalTrades(**vars(k))

vars(k) возвращает __dict__ из k самого , который мы затем распаковываем с ** в пары имя / значение в качествеключевые аргументы для инициализации 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)

, что является одновременно кратким и самодокументированием.

0 голосов
/ 07 февраля 2019

Наследование звучит здесь полезно:

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

Но я думаю, что нам потребуется больше информации, чтобы предоставить вам более подходящий ответ ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...