Python:调用超类的新方法
我有两个定义如下的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
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,又是一个错误。我编辑了它。但这不是重点。