将子类名称作为父类方法的参数传递
你最近怎么样?
我其实没有遇到什么问题,但我想改进我的代码,只是不知道该怎么做。现在我面临的“问题”是:
我有一个父类:
class Utils:
@staticmethod
def jsonFromDict(className, dict):
# code logic here
return className(**finalValue)
然后我有一堆数据类,比如:
@dataclass
class payloadA(Utils):
x: str = ''
y: str = ''
z: str = ''
我想把类名传给jsonFromDict,而不想每次都重复写类名。现在我这样做:
payloadA.jsonFromDict(payloadA, dict)
payloadB.jsonFromDict(payloadB, dict)
payloadC.jsonFromDict(payloadC, dict)
我不想在每个数据类里面重写或者重复实现,但我找不到办法把我调用父类方法的实例的类名传给父类的方法。
有没有什么办法可以做到这一点呢?
我试过在每个类里面重写,但我想保持代码的简洁性,也就是不重复代码。
2 个回答
0
你可以使用 self.__class__.__name__
,因为即使这个方法只在父类里声明,self的类型还是子类。
举个例子:
class Father:
def foo(self):
print(self.__class__.__name__)
class Son(Father):
def __init__(self):
self.foo()
son = Son()
这会打印出 Son
。
补充说明:重新看了一下你的代码,其实你并不想要类名,而是想要类本身。在这种情况下,你可以使用 self.__class__
,就不需要 .__name__
了。所以,再举个例子:
class Father:
def foo(self):
return self.__class__("cloned")
class Son(Father):
def __init__(self, val):
self.val = val
son = Son("original")
print(type(son), son.val)
otherson = son.foo()
print(type(otherson), otherson.val)
3
你想要一个替代的构造函数,在Python中,最常用的方法是用一个叫做classmethod
的东西。你的基类在这里充当了一个混合类,所以我把它的名字改了。
class ConstructorMixin:
@classmethod
def jsonFromDict(cls, dict):
# code logic here
return cls(**finalValue)
@dataclass
class PayloadA(ConstructorMixin):
x: str = ''
y: str = ''
z: str = ''
pl = PayloadA.jsonFromDict(some_dict)