Можно ли сделать переменную ссылкой на атрибут класса в Python3? - PullRequest
0 голосов
/ 07 февраля 2020

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

class Data:

    def __init__(self):
        self.a = 1
        self.b = 1

    def increment(self, a_or_b):

        variable = {'a': self.a, 'b': self.b}[a_or_b]
        variable += 1

d1 = Data()
d1.increment(a_or_b='a')
print(d1.a)

Я хочу, чтобы d1.a равнялось 2, но оно равно 1, потому что атрибут класса на самом деле не был изменен, только переменная variable. Вместо этого я мог бы определить приращение как:

def increment(self, a_or_b): 
    if a_or_b is 'a': 
        self.a += 1
    else: 
        self.b += 1 

Но это кажется громоздким, особенно если я хочу весь алфавит, а не только первые две буквы. Есть ли способ сделать вместо variable ссылку на self.a или self.b, чтобы атрибут был изменен?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Вы, вероятно, не должны этого делать, но вот вариант.

class Data:

    def __init__(self):
        self.a = 1
        self.b = 1

    def increment(self, a_or_b):
        if hasattr(self, a_or_b):
            setattr(self, a_or_b, getattr(self, a_or_b) + 1)


d1 = Data()
d1.increment('a')
print(d1.a)

Это манипулирование встроенными функциями hasattr, setattr и getattr.

hasattr принимает 2 аргумента. Объект, который передается с self, а имя атрибута в виде строки.

getattr принимает те же 2 аргумента.

setattr принимает один дополнительный аргумент. Значение, которое вы установите sh.

1 голос
/ 07 февраля 2020

Если у вас есть весь алфавит, то 26 (дать или взять) отдельные атрибуты - неправильный подход. Используйте dict.

class Data:

    def __init__(self):
        self.data = dict.fromkey("abcdefghijklmnopqrstuvwxyz", 1)

    def incrementself, c):
        self.data[c] += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...