2015-06-20 71 views
1

Ruby代碼:如何最好地在Python實現這個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 

我從來沒有用過混入或多重繼承之前,蟒蛇,所以這只是什麼我放在一起,所以我只想知道這是Pythonic做我想做的方式還是有一個更清潔的方式來寫這個。

+0

我不能評論Python代碼,但Ruby代碼很糟糕。 'to_f'應該返回一個'Float',而不是'File',它*當然*不應該有任何副作用!此外,「自我」是多餘的。 –

+0

我從一本書中得到了Ruby代碼,它只是示例代碼顯示了mixins,但並不意味着我認爲有意義。 – Riina

回答

0

您應該至少喜歡使用神奇的__str__方法,而不是遵循Ruby的命名約定。使用format作品完全不同,以紅寶石串插,但在這種情況下,去除#將工作等同

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__方法。

+0

@steenslag。我認爲你是對的,我認爲OP意味着它在輸出中,但是它不匹配Ruby版本。 –

相關問題