Каково различие между Ruby и версиями Python “сам”?

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

Трудно сказать, не видя вашего полного кода, но, возможно, следующее предложит возможное альтернативное решение:

#!/usr/bin/env python

import datetime

def start():
    start_time = datetime.datetime.now()
    return start_time

def stop():
    stop_time = datetime.datetime.now()
    return stop_time

def delta(start,stop):
    delta_time = stop - start
    print(delta_time)

start=start()
stop=stop()
delta(start,stop)

Это решение перемещает две сгенерированные временные метки (start_time и stop_time) в одна единственная функция (delta) в качестве аргументов, так что когда вычисляется delta_time, она выполняется для переменных подобного типа в рамках своей функции.

6
задан John Mulder 1 October 2008 в 22:42
поделиться

4 ответа

Python разработан для поддержки больше, чем просто объектно-ориентированное программирование. Сохранение того же интерфейса между методами и функциями позволяет двум стилям взаимодействовать более чисто.

Ruby был создан с нуля, чтобы быть объектно-ориентированным. Даже литералы являются объектами (оцените 1.class, и Вы получаете Fixnum). Язык был создан таким образом, что сам зарезервированное слово, которое возвращает текущий экземпляр где бы вы ни были.

Если Вы в методе экземпляра одного из Вашего класса, сам ссылка на упомянутый экземпляр.

Если Вы находитесь в определении самого класса (не в методе), сам сам класс:

class C
  puts "I am a #{self}"
  def instance_method
    puts 'instance_method'
  end
  def self.class_method
    puts 'class_method'
  end
end

Во время определения класса, 'Я - C', будет распечатан.

Прямое 'определение' определяет метод экземпляра, тогда как 'определение self.xxx' определяет метод класса.

c=C.new

c.instance_method
#=> instance_method
C.class_method
#=> class_method
7
ответ дан 8 December 2019 в 05:24
поделиться

Несмотря на требование webmat, Guido записал, что явный сам "не взлом реализации - это - семантическое устройство".

Причиной явного сам в подписях определения метода является семантическая непротиворечивость. Если Вы пишете

класс C: нечто определения (сам, x, y):...

Это действительно совпадает с записью

класс C: передача

нечто определения (сам, x, y):... C.foo = нечто

Это было намеренным проектным решением, не результатом представления поведения OO в последнюю дату.

Все в Python-is-объект, включая литералы.

См. также, Почему 'сам' должен использоваться явно в определениях метода и вызовах?

6
ответ дан 8 December 2019 в 05:24
поделиться

сам используется только в качестве конвенции, можно использовать спам, бекон или колбасу вместо сам и получить тот же результат. Это - просто первый аргумент, переданный связанным методам. Но придерживайтесь использования сам, поскольку оно смутит других и некоторых редакторов.

5
ответ дан 8 December 2019 в 05:24
поделиться

Ну, я не знаю много о Ruby. Но очевидный факт о Python "сам" - то, что это не "ключевое слово"... это - просто название аргумента, который это отправляется в Ваш метод.

Можно использовать любое имя, которое Вы любите за этот аргумент. "Сам" просто конвенция.

Например:

class X :
    def __init__(a,val) :
        a.x = val
    def p(b) :
        print b.x

x = X(6)
x.p()

Печатает номер 6 на терминале. В конструкторе сам объект на самом деле называют a. Но в p () метод, это назвало b.

Обновление: В октябре 2008 Guido указал, что наличие явного сам было также необходимо, чтобы позволить декораторам Python быть достаточно общими для работы над чистыми функциями, методами или classmethods: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

5
ответ дан 8 December 2019 в 05:24
поделиться