Python:调用超类的新方法

Python:调用超类的新方法,python,inheritance,overriding,subclass,Python,Inheritance,Overriding,Subclass,我有两个定义如下的python类: class A(object) : def __init__(self, param) : print('A.__init__ called') self.param = param def __new__(cls, param) : print('A.__new__ called') x = object.__new__(A) x._initialize

我有两个定义如下的python类:

class A(object) : 

    def __init__(self, param) : 
        print('A.__init__ called')
        self.param = param

    def __new__(cls, param) :
        print('A.__new__ called') 
        x = object.__new__(A)
        x._initialize()    # initialization code
        return x

class B(A) : 

    def __init__(self, different_param) : 
        print('B.__init__ called')

    def __new__(cls, different_param) : 
        print('B.__new__ called')
        # call __new__ of class A, passing "param" as parameter
        # and get initialized instance of class B
        # something like below
        b = object.__new__(B)
        param = cls.convert_param(different_param)
        return super(B, cls).__new__(b, param)    # I am expecting something
                                                  # similar to this

    @staticmethod
    def convert_param(param) : 
        return param 
B类
a类
的一个子类。这两个类之间的区别在于,传递给
类B
的参数的格式与
类a
所期望的格式不同。因此,调用
classB
convert\u param
方法,将参数转换为与
classa
新方法兼容

我被困在我希望调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuua类
方法的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>部分,因为在那里发生了很多初始化,然后返回
类B
的初始化实例


我很难弄明白这一点。请提供帮助。

convert\u param
应该是
staticmethod
classmethod
,并且您不想从
B
调用
对象。\uu新的\uuuuuu
(否则,您实际上是在尝试创建
B
的两个新实例,而不是一个)。如果
convert\u param
staticmethod
classmethod
,则可以在拥有实例之前进行参数转换(例如,在超类上调用
\uuuu new\uuu
之前):

此外,您需要稍微更改
A
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

class A(object) : 
    def __new__(cls, param) :
        print('A.__new__ called') 
        x = super(A, cls).__new__(cls)
        x._initialize()    # initialization code
        return x

convert\u param
应该是
staticmethod
classmethod
,并且您不想从
B
调用
对象。如果
convert\u param
staticmethod
classmethod
,则可以在拥有实例之前进行参数转换(例如,在超类上调用
\uuuu new\uuu
之前):

此外,您需要稍微更改
A
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

class A(object) : 
    def __new__(cls, param) :
        print('A.__new__ called') 
        x = super(A, cls).__new__(cls)
        x._initialize()    # initialization code
        return x

我对代码进行了编辑,使其符合您的建议。这是错误的,但这不是我的问题。我的问题是:如何让
返回super(B,cls)。\uuuuu new(cls,params)
工作(现在显然不正确。我无法从
类B
)的
\uuuuuu new\uuuuu
方法返回实例类A)——啊,我现在看到了。您在对
对象的调用中硬编码了
A
。\uuuuu new\uuuu
。您需要使用
对象。\uuuu new\uuuu(cls)
来代替。非常感谢。纠正了我所有的误解。我编辑了代码,使它符合你的建议。这是错误的,但这不是我的问题。我的问题是:如何让
返回super(B,cls)。\uuuuu new(cls,params)
工作(现在显然不正确。我无法从
类B
)的
\uuuuuu new\uuuuu
方法返回实例类A)——啊,我现在看到了。您在对
对象的调用中硬编码了
A
。\uuuuu new\uuuu
。您需要使用
对象。\uuuu new\uuuu(cls)
来代替。非常感谢。更正了我所有的误解。静态方法不接受隐式的第一个参数:
def convert\u param(param):…
@chepner,又是一个错误。我编辑了它。但这不是重点。静态方法不接受隐式的第一个参数:
def convert\u param(param):…
@chepner,又是一个错误。我编辑了它。但这不是重点。