2015-06-20 1 views
1

Ruby, код:Как лучше реализовать этот Ruby-код в Python

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 

Я никогда не использовал Примеси или множественное наследование, прежде чем в питона, так это только то, что Я собрал вместе, поэтому я просто хочу знать, что это питонический способ делать то, что я хочу, или есть более чистый способ написать это.

+0

Я не могу комментировать код Python, но код Ruby ужасен. 'to_f' должен возвращать' Float', а не 'File', и он * обязательно * не должен иметь никаких побочных эффектов! Кроме того, «я» является излишним. –

+0

Я получил код ruby ​​из книги lol, его примерный код, показывающий миксины, хотя и не должен быть чем-то значимым, я думаю. – Riina

ответ

0

Вы должны по крайней мере предпочесть использовать метод магии __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 или что-то.

Я также избегаю использования метода __init__ на классах mixin.

+0

@steenslag. Я думаю, что вы правы, я думал, что OP означает, что он должен быть на выходе, но тогда он не соответствует версии Ruby. –