Объявление переменных - лучшие практики

Попробуйте использовать: currency = pd.read_html (r)

вместо: currency = pd.read_html ('r')

, поскольку вы вызываете метод read_html со строкой " r "в качестве аргумента, а не как переменная r

SLP

5
задан Blair Conrad 30 October 2008 в 00:48
поделиться

12 ответов

При установке переменной за пределами конструктора затем нет никакой обработки ошибок (handeling) доступна. В то время как в Вашем примере это не имеет никакого значения, но существует много случаев, что можно хотеть иметь своего рода обработку ошибок. В этом случае использование Вашей первой опции было бы корректно.

Nescio говорил, о какой импликации это имело бы на Вашем applicaiton, если бы были некоторые отказы конструктора.

По этой причине я всегда использую Опцию № 1.

12
ответ дан 18 December 2019 в 06:52
поделиться

Честно, если Вы смотрите на IL, все, что происходит во втором случае, перемещения компилятора инициализация конструктору для Вас.

Лично, мне нравится видеть всю инициализацию, сделанную в конструкторе. Если я работаю над одноразовым опытным проектом, я не возражаю иметь инициализацию и объявление в том же месте, но для мой, "Я хочу сохранить это" проектами, я делаю все это в конструкторе.

6
ответ дан 18 December 2019 в 06:52
поделиться

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

1
ответ дан 18 December 2019 в 06:52
поделиться

Существует общий шаблон под названием Внедрение зависимости или Инверсия управления (IOC), которая предлагает точно эти два механизма для "введения" подчиненного объекта (как класс DAL) в класс, это - furthur цепочка зависимости (furthur от базы данных)

В этом шаблоне, с помощью ctor, Вы были бы

общедоступный класс SomeClass
{
частный PersonObject на;

 public SomeClass(PersonObject person) 

 {      
     per = person;   
 }   

}

частный PersonObject Joe = новый PersonObject ("Smitface");

SomeClass MyObj = новый SomeClass (Joe);

Теперь Вы могли, например, передача в реальном классе DAL для производственного вызова или теста класс DAL в методе модульного теста...

2
ответ дан 18 December 2019 в 06:52
поделиться

На самом деле, несмотря на то, что сказали другие, может быть важно, является ли Ваша инициализация внутри или снаружи конструктора, поскольку существует другое поведение во время объектной конструкции, если объект находится в иерархии (т.е. порядок, в котором выполняются вещи, отличается).

См. это сообщение и это сообщение от Eric Lippert, который объясняет семантическое различие между двумя более подробно.

Таким образом, ответ - то, что в большинстве случаев это не имеет никакого значения, и это, конечно, не делает различия в терминах из производительности, но в меньшинстве случаев это могло иметь значение, и необходимо знать, почему, и принимают решение на основе этого.

4
ответ дан 18 December 2019 в 06:52
поделиться

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

Это - персональное предпочтение действительно, они оба делают то же самое.

0
ответ дан 18 December 2019 в 06:52
поделиться

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

Конечно, это только рассчитывает, при отсутствии неопровержимых доводов для использования инициализации в конструкторе (как упомянуто, дископотягиваются).

1
ответ дан 18 December 2019 в 06:52
поделиться

Мне нравится инициализировать в конструкторе, потому что тот способ, которым все это происходит в одном месте, и также потому что это помогает, если Вы решаете создать перегруженного конструктора позже.

Кроме того, это помогает напомнить мне о вещах, что я захочу вымыться в deconstructor.

0
ответ дан 18 December 2019 в 06:52
поделиться

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

0
ответ дан 18 December 2019 в 06:52
поделиться

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

0
ответ дан 18 December 2019 в 06:52
поделиться

Первое объявление является на самом деле инструментом для очистки. Второе скрывает факт, конструктор инициализирует класс в статическом конструкторе. Если по какой-либо причине сбои конструктора, целый тип неприменим для остальной части applicaiton.

0
ответ дан 18 December 2019 в 06:52
поделиться

Я предпочитаю инициализировать переменные как можно скорее, так как это избегает (немного) пустых ошибок.

Править: Очевидно, в этом упрощенном примере нет никакого различия, однако в общем случае, я полагаю, что это - хорошая практика для инициализации переменных класса, когда они объявляются, если это возможно. Это лишает возможности относиться к переменной перед ним, это инициализировало, который устраняет некоторые ошибки, которые были бы возможны, когда Вы инициализируете поля в конструкторе.

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

-3
ответ дан 18 December 2019 в 06:52
поделиться