代码之家  ›  专栏  ›  技术社区  ›  GuessMe

返回新类对象的正确方法(也可以扩展)

  •  0
  • GuessMe  · 技术社区  · 2 年前

    我试图找到一种在class方法中返回(新的)class对象的好方法,该方法也可以扩展。

    我有一个类(classA),其中包括一个方法,这个方法在经过一些处理后返回一个新的classA对象

    class classA:
       def __init__(): ...
    
       def methodX(self, **kwargs):
          process data
          return classA(new params)
    

    现在,我将这个类扩展到另一个B类。我需要methodX做同样的事情,但是这次返回classB,而不是classA

    class classB(classA):
       def __init__(self, params):
          super().__init__(params)
          self.newParams = XYZ
       
       def methodX(self, **kwargs):
          ???
    

    这可能是件小事,但我就是想不出来。最后,我不想每次扩展类时都重写methodX。

    谢谢你抽出时间。

    2 回复  |  直到 2 年前
        1
  •  0
  •   Kurt    2 年前

    使用 __class__ 属性如下:

    class A:
        def __init__(self, **kwargs):
            self.kwargs = kwargs
    
        def methodX(self, **kwargs):
            #do stuff with kwargs
            return self.__class__(**kwargs)
    
        def __repr__(self):
            return f'{self.__class__}({self.kwargs})'
    
    class B(A):
        pass
    
    a = A(foo='bar')
    ax = a.methodX(gee='whiz')
    b = B(yee='haw')
    bx = b.methodX(cool='beans')
    
    print(a)
    print(ax)
    print(b)
    print(bx)
    
        2
  •  0
  •   JarroVGIT    2 年前
    class classA:
        def __init__(self, x):
           self.x = x
    
        def createNew(self, y):
            t = type(self)
            return t(y)
    
    class classB(classA):
        def __init__(self, params):
            super().__init__(params)
    
    
    a = classA(1)
    newA = a.createNew(2)
    
    b = classB(1)
    newB = b.createNew(2)
    
    print(type(newB))
    # <class '__main__.classB'>