为类方法调用私有方法:python

时间:2014-07-25 00:06:32

标签: python

我正在尝试在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结构。

3 个答案:

答案 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