我正在尝试在python中实现多个构造函数,其中一个建议(通过在线搜索)是使用classmethod。但是,使用这个,我遇到了代码重用和模块化的问题。下面是一个示例,我可以根据提供的文件或其他方式创建对象:
class Image:
def __init__(self, filename):
self.image = lib.load(filename)
self.init_others()
@classmethod
def from_data(cls, data, header):
cls.image = lib.from_data(data, header)
cls.init_others()
return cos
def init_others(self):
# initialise some other variables
self.something = numpy.matrix(4,4)
现在看来我不能这样做。 cls.init_others()调用失败,说我没有提供对象来调用它。我想我可以在from_data函数本身中初始化东西,然后我重复 init 方法中的代码和其他"构造函数"。有谁知道如何从这些@classmethod标记函数中调用这些其他初始化方法?或许有人知道更好的方法来初始化这些变量。
我来自C ++背景。所以仍然试图找到我的方式围绕python结构。
答案 0 :(得分:2)
我建议不尝试创建多个构造函数,而是使用关键字参数:
class Image(object):
def __init__(self, filename=None, data=None, header=None):
if filename is not None:
self.image = lib.load(filename)
elif data is not None and header is not None:
self.image = lib.from_data(data, header)
else:
raise ValueError("You must provide filename or both data and header")
self.init_others()
def init_others(self):
# initialise some other variables
self.something = numpy.matrix(4,4)
这是处理这种情况的更多Pythonic方式。
答案 1 :(得分:2)
您的类方法应该创建并返回类的新实例,而不是分配类属性并返回类本身。作为关键字参数的替代方法,您可以执行以下操作:
class Image:
def __init__(self, image):
self.image = image
self.init_others()
@classmethod
def from_data(cls, data, header):
return cls(lib.from_data(data, header))
@classmethod
def from_filename(cls, filename):
return cls(lib.load(filename))
def init_others(self):
# initialise some other variables
self.something = numpy.matrix(4, 4)
如果您已经拥有image
,则会添加创建实例的功能。
答案 2 :(得分:1)
您应该始终将self
作为第一个参数传递给任何将作用于类实例的方法。除非您这样做,否则Python不会自动确定您尝试调用该方法的实例。所以如果你想使用像
the_image = Image("file.txt")
the_image.interpolate(foo,bar)
您需要在Image
中将方法定义为
def interpolate(self,foo,bar):
# Your code