Как предварительно установить переменную объекта в методе в Python - PullRequest
0 голосов
/ 28 октября 2019

Пример:

class User():
    def __init__(self, name, password):
        self.name = name
        self.password = password

    def edit(self, name=self.name, password=self.password): <- ERROR
        self.name = name
        self.password = password

Я хочу изменить имя или пароль объекта следующим образом:

object.edit(password="New password")

Приходит ошибка:

undefined variable "self"

Я сделал это так, потому что тогда я могу редактировать только одну вещь, а другая остается прежней. Пожалуйста, помогите мне! Есть ли другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 28 октября 2019
def edit(self, name=self.name, password=self.password): <- ERROR

Где вы установите name=self.name, вы устанавливаете значение по умолчанию. self здесь недоступно, так как вы передаете его вместе с другими значениями.

Я бы оставил здесь значения по умолчанию - вы можете справиться с проверкой в ​​самой подпрограмме edit. т.е. просто есть:

def edit(self, name, password):
0 голосов
/ 28 октября 2019

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

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

class User():
    def __init__(self, name, password):
        self.name = name
        self.password = password

    def edit(self, name=None, password=None):
        if name is not None:
            self.name = name
        if password is not None:
            self.password = password

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

class User():
    def __init__(self, name, password):
        self.name = name
        self.password = password

    def edit(self, name=None, password=None):
        self.name = name if name is not None else self.name
        self.password = password if password is not None else self.password
0 голосов
/ 28 октября 2019

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

def edit(self, **kwargs):
    if 'name' in kwargs:
        self.name = kwargs['name']
    if 'password' in kwargs:
        self.password = kwargs['password']

Вы можете вызвать ее с помощью instance.edit(password='newpass'), итолько пароль будет обновлен.

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