Повторно используйте аргумент или используйте себя - PullRequest
0 голосов
/ 20 февраля 2020

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

class Example:
    def __init__(self, name):
        self.name = name
        self.name_upper = name.upper()

или

class Example:
    def __init__(self, name):
        self.name = name
        self.name_upper = self.name.upper()

А что со списком?

class Example:
    def __init__(self, name):
        self.name = name
        self.name_list = [name,name,name]
class Example:
    def __init__(self, name):
        self.name = name
        self.name_list = [self.name,self.name,self.name]

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

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

Если нет аргумента массива до того, как он сохранен в атрибуте, тогда это не имеет значения. Использование неквалифицированного имени будет немного быстрее (self.name на CPython подразумевает дешевое LOAD_FAST и значительно более дорогое, хотя все еще дешевое в абсолютном выражении, LOAD_ATTR; обычное name для аргумента: просто LOAD_FAST), поэтому, если вы 100% уверены, что никогда не собираетесь массировать аргумент перед хранением (например, не self.name = int(name)), избегая self, когда вы можете, ускорит инициализацию немного.

Тем не менее, это редко, чтобы быть уверенным, поэтому использование self.name безопаснее. Хотя вы всегда можете разделить разницу, даже когда массируете аргументы, выполнив что-то вроде:

self.name = name = int(name)

, который сохраняет обратно как атрибут, так и локальный (через DUP_TOP и STORE_FAST, два из самых дешевых коды операций в CPython), так что вы получаете одинаковое массируемое значение любым способом и дешевые грузы из неквалифицированного имени.

0 голосов
/ 20 февраля 2020

Это вопрос сферы. В приведенном ниже примере переменная 'name' отображается только в методе '__init__', тогда как переменная 'self.name_list' может использоваться в любом методе класса.

class Example :
    def __init__ (self, name) :
        self.name_list = [name] * 3

    def show_variables (self) :
        print (self.name_list)
        print (name)      # gives 'name' is not defined error

this = Example ('This example')
this.show_variables ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...