如何在Python中最好地实现这个Ruby代码

时间:2015-06-20 09:20:14

标签: python ruby multiple-inheritance mixins

Ruby代码:

module ToFile
  def filename
    "object_#{self.object_id}.txt"
  end

  def to_f
    File.open(filename, 'w') { |f| f.write(to_s) }
  end
end

class Person
  include ToFile
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def to_s
    name
  end
end

我的Python代码

class ToFile:
    def __init__(self):
        self.filename = "object_#{0}.txt".format(id(self))

    def to_f(self):
        with open(self.filename, 'w') as f:
            f.write(self.to_s())

class Person(ToFile):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def to_s(self):
        return self.name

我之前从未在python中使用过mixins或多继承,所以这就是我放在一起所以我只是想知道这是做我想要的Pythonic方式还是有更简洁的方法来写这个

1 个答案:

答案 0 :(得分:0)

您至少应该使用magic __str__方法而不是遵循Ruby的命名约定。使用format的字符串插值与Ruby完全不同,但在这种情况下删除#将等效地工作

class ToFile:
    def __init__(self):
        self.filename = "object_{0}.txt".format(id(self))

    def to_f(self):
        with open(self.filename, 'w') as f:
            f.write(str(self))

class Person(ToFile):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def __str__(self):
        return self.name

to_f也应该重命名为write_to_file或其他内容。

我也避免在mixin类上使用__init__方法。