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
我有一个 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