Допустим, у меня есть два класса:
class A:
def __init__(self):
data = 0
def copy(self):
other = A()
other.data = self.data
return other
class B(A):
# B *does not* override A's __new__ or __init__
@classmethod
def from_A(cls, a):
a.__class__ = cls
return a
a = A()
b = B()
B.from_A(a) # instance of B
b.copy() # instance of A
B.from_A(b.copy() # ... B
Проблема, конечно же, в том, что B().copy()
возвращает экземпляр A
. Я могу обойти это, определив метод-оболочку copy
для B
, или я могу вызвать B.from_A(B().copy())
. Первый вариант требует обертывания всех таких методов; последний кажется опасным и вводит много шаблонов.
Есть ли более стандартный c способ Pythoni сделать это? Я спрашиваю, в частности, о случае, когда у меня нет доступа к реализации A
, а соответствующие методы не являются методами классов. В качестве конкретного примера: я мог бы попытаться создать подкласс pandas.DataFrame
и хочу убедиться, что B.copy()
и B.merge(...)
возвращают экземпляры B
, а не DataFrame
.