Реализация ссылок/указателей в питоне аля С++

python
Теги: #<Tag:0x00007fedb994c100>

(Artur Korobeynyk) #1

Допустим есть ситуация когда у вас есть метом класса, который в зависимости от ситуации должен писать либо в одну переменную, либо в другую. Например класс tester при выполнении бета и альфа версии программы должен соответственно писать либо в переменную класса alfalog или betalog.
Часто видел вариант решения как:

def write_log(self, beta=true):
    ...
    if beta:
         self.betalog += "blabla"
    else:
        self.alphalog += "blabla"
    ...
    if beta:
         self.betalog += "blabl_another"
    else:
        self.alphalog += "blabl_another"

И в одном методе такая конструкция может встречаться несколько раз. Для себя нашел решение поудобнее. Реализация через ссылки на обьект.

class ref:
    def __init__(self, obj): self.obj = obj
    def get(self):    return self.obj
    def set(self, obj):      self.obj = obj
    def __add__(self, other): "".join(self.obj) + other
    def __indexof__(self, i): "".join(self.obj)[i]

class tester:
    def __init__(self, ...):
        self.alphalog = ref('')
        self.betalog = ref('')
    ....
    def write_log(self, beta=true):
        log = None
        if beta:
            log = self.betalog
        else:
            log = self.alphalog
        ....
        log = log + "blabla"
        #в этом месте соответственно будет произведена запись либо в альфа либо в бета, в зависимости от параметра
        log += "blabla_another"

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


(Viktor) #2

Можно упростить: вынесите проверку в конструктор. Вряд ли версия будет меняться в рантайме.


(Artur Korobeynyk) #3

Ну операции с логом здесь просто для примера, чтобы показать как работает. Основной смысл в обьекте ref