Должен ли я каждый раз использовать "собственную" версию переменной в классе Python - PullRequest
0 голосов
/ 03 августа 2020

Это больше вопрос о том, какие лучшие практики или лучшие советы по стилю использования self в Python, чем о том, как это использовать. В основном мой вопрос: следует ли мне использовать «собственную» версию моей переменной как можно скорее и каждый раз после этого, или уместно ли иногда использовать «несамостоятельную» версию.

Вот пример, в котором я как можно скорее использую «собственную» версию своих переменных:

def outside_function1(var1, var2):
    """Does something"""
    
def outside_function2(var1, var2):
    """Does something else"""

class MyClass1:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        
        self.variable_to_calculate = outside_function1(self.a, self.b, self.c) + outside_fuction2(self.a, self.b, self.d)

Вот другой пример, в котором я не использую «собственную» версию своих переменных в той же функции инициализации :

class MyClass2:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        
        self.variable_to_calculate = outside_function1(a, b, c) + outside_fuction2(a, b, d)

Если вы не заметили, разница в строке с self.variable_to_calculate.

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

Итак, если оба этих примера будут делать одно и то же, один из них более правильный?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Лично я бы использовал свой вариант как можно скорее. Причина тому - ремонтопригодность. Параметры функции init используются только для загрузки конструктора.

Допустим, в будущем вы больше не хотите вызывать external_function напрямую с помощью var b, потому что ваш класс был адаптирован, а var b теперь разделен в var e и var f. Внутри вы все еще можете воссоздать self.b, и вам не придется изменять какие-либо внешние вызовы функций.

1 голос
/ 03 августа 2020

Это зависит.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...