将子类名称作为父类方法的参数传递

0 投票
2 回答
46 浏览
提问于 2025-04-14 17:49

你最近怎么样?

我其实没有遇到什么问题,但我想改进我的代码,只是不知道该怎么做。现在我面临的“问题”是:

我有一个父类:

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)

撰写回答