Python 使用数据class 将基础 class 对象转换为子对象class

Python casting base class object to subclass using dataclass

我有一个 Employee base class 和一个 Manager subclass。 subclass 接受一个 Employee obj 并将其转换为 Manager.

下面的代码工作正常,但是我正在尝试确定如何使用数据创建相同的代码class。

class Employee:
    def __init__(self, id: int, name: str):
        self.id = id
        self.name = name

class Manager(Employee):
    def __init__(self, employee: Employee, region: str):
        super().__init__(**vars(employee))
        self.region = region

e1 = Employee(1, 'Bob')
e2 = Employee(2, 'Sally')

# Sally gets promoted to manager of southwest region
e2 = Manager(e2, 'southwest')

这是我目前的情况,我不确定如何传递所有必需的参数。

@dataclass
class Employee:
    id: int
    name: str

@dataclass
class Manager(Employee):
    region: str
    def __new__(cls, employee: Employee, region: str):
        obj = object.__new__(cls)
        super().__init__(obj, **vars(employee))
        return obj

e2 = Employee(2, 'Sally')
>>> Manager(e2, region='southwest')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'

我不确定所有 __new__ 元类 hackery 是为了完成什么,但你很少需要在 Python 中重写 __new__,这不是异常。

@dataclass
class Employee:
    id: int
    name: str

@dataclass
class Manager(Employee):
    region: str

e2 = Employee(2, 'Sally')
m2 = Manager(2, 'Sally', 'southwest')

数据类就是这样; 类 表示存储数据。 data类 的继承如您所料。继承就好了。

如果您仍然希望使用 Employee 作为参数,您可以使用 __init__ 而不是 __new__

@dataclass
class Employee:
    id: int
    name: str

@dataclass
class Manager(Employee):
    region: str
    def __init__(self, employee: Employee, region: str):
        super().__init__(**vars(employee))
        self.region = region