Python class 相互依存关系
Python class interdependencies
我有一个 python class 作为进一步子 class 的基础class。它包含一个应该作用于所有 subclass 相同的方法,例如我想把它放在基数 class 中。问题是,这个方法应该 return subclass 的一个新实例。但是我因为 baseclass 位于 subclass 的定义之前,所以我不能创建 subclass 的新实例,因为它在基础class:
class Base:
def __init__(self, value):
self.value = value
def convert_child_classes(self, newclass):
newvalue = MakeUsableInNewclass(self.value)
newattr = MakeUsableInNewclass(self.subclassattr)
return newclass(newattr, newvalue)
class Child1(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def MethodForSubClassAttr(self):
...do sth with self.subclassattr...
class Child2(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def SomeOtherSubClassAttrMethod(self):
...do sth that is related to this class attr...
如果我有一个 Child1 的实例,我希望能够用它的数据做一些事情,然后 return 一个 Child2 的实例,在调用 convert_child_classes(Child2 ):
A = Child1('someattr', 5)
B = A.convert_child_classes(Child2)
现在 B 应该是 Child2 的一个实例,其值是从 Child1 计算得出的。但由于 Base class 现在知道 Child1 或 Child2 是什么,它无法启动新的 class.
像这样的东西应该可以工作(未经测试):
class Measurement:
@classmethod
def from_other(cls, other):
base = other.convert_to_base_unit()
converted = cls.base_to_unit(base)
return cls(converted)
@classmethod
def base_to_unit(cls, value):
# Let the subclass implement this
raise NotImplementedError
def convert_to_base_unit(self):
# Let the subclass implement this
raise NotImplementedError
以这种方式实现,基 class 不需要知道子class 的任何信息。基础 class 提供模板方法 (from_other
),子 classes 提供实现。
我遇到了你的问题:
1. 实际上你在 super
中使用 Child
这是错误的,因为它应该是你正在操作的 class 的名称,在本例中是 Child1
或 Child2
。
2. 我将添加 Base 作为抽象 class,以确保它不会被实例化(正如我从你的问题中得到的那样)。
3. 由于方法 MakeUsableInNewClass
是强制实施的,我将添加为 abstractmethod
以确保在子方法上实施。
所以正确的代码是:
from abc import ABC, abstractmethod
class Base(ABC):
def __init__(self, value):
self.value = value
def convert_child_classes(self, newclass):
newvalue, newattr = self.MakeUsableInNewclass()
return newclass(newattr, newvalue)
@abstractmethod
def MakeUsableInNewclass(): pass
class Child1(Base):
def __init__(self, subclassattr, value):
super(Child1, self).__init__(value)
self.subclassattr = subclassattr
def MakeUsableInNewclass(self):
newvalue = self.value #do operations
newattr = self.subclassattr #do operations
return newvalue, newattr
class Child2(Base):
def __init__(self, subclassattr, value):
super(Child2, self).__init__(value)
self.subclassattr = subclassattr
def MakeUsableInNewclass(self):
newvalue = self.value #do operations
newattr = self.subclassattr #do operations
return newvalue, newattr
我有一个 python class 作为进一步子 class 的基础class。它包含一个应该作用于所有 subclass 相同的方法,例如我想把它放在基数 class 中。问题是,这个方法应该 return subclass 的一个新实例。但是我因为 baseclass 位于 subclass 的定义之前,所以我不能创建 subclass 的新实例,因为它在基础class:
class Base:
def __init__(self, value):
self.value = value
def convert_child_classes(self, newclass):
newvalue = MakeUsableInNewclass(self.value)
newattr = MakeUsableInNewclass(self.subclassattr)
return newclass(newattr, newvalue)
class Child1(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def MethodForSubClassAttr(self):
...do sth with self.subclassattr...
class Child2(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def SomeOtherSubClassAttrMethod(self):
...do sth that is related to this class attr...
如果我有一个 Child1 的实例,我希望能够用它的数据做一些事情,然后 return 一个 Child2 的实例,在调用 convert_child_classes(Child2 ):
A = Child1('someattr', 5)
B = A.convert_child_classes(Child2)
现在 B 应该是 Child2 的一个实例,其值是从 Child1 计算得出的。但由于 Base class 现在知道 Child1 或 Child2 是什么,它无法启动新的 class.
像这样的东西应该可以工作(未经测试):
class Measurement:
@classmethod
def from_other(cls, other):
base = other.convert_to_base_unit()
converted = cls.base_to_unit(base)
return cls(converted)
@classmethod
def base_to_unit(cls, value):
# Let the subclass implement this
raise NotImplementedError
def convert_to_base_unit(self):
# Let the subclass implement this
raise NotImplementedError
以这种方式实现,基 class 不需要知道子class 的任何信息。基础 class 提供模板方法 (from_other
),子 classes 提供实现。
我遇到了你的问题:
1. 实际上你在 super
中使用 Child
这是错误的,因为它应该是你正在操作的 class 的名称,在本例中是 Child1
或 Child2
。
2. 我将添加 Base 作为抽象 class,以确保它不会被实例化(正如我从你的问题中得到的那样)。
3. 由于方法 MakeUsableInNewClass
是强制实施的,我将添加为 abstractmethod
以确保在子方法上实施。
所以正确的代码是:
from abc import ABC, abstractmethod
class Base(ABC):
def __init__(self, value):
self.value = value
def convert_child_classes(self, newclass):
newvalue, newattr = self.MakeUsableInNewclass()
return newclass(newattr, newvalue)
@abstractmethod
def MakeUsableInNewclass(): pass
class Child1(Base):
def __init__(self, subclassattr, value):
super(Child1, self).__init__(value)
self.subclassattr = subclassattr
def MakeUsableInNewclass(self):
newvalue = self.value #do operations
newattr = self.subclassattr #do operations
return newvalue, newattr
class Child2(Base):
def __init__(self, subclassattr, value):
super(Child2, self).__init__(value)
self.subclassattr = subclassattr
def MakeUsableInNewclass(self):
newvalue = self.value #do operations
newattr = self.subclassattr #do operations
return newvalue, newattr