Совместно использовать переменную между экземплярами одного и того же класса в python - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть класс, который мне нужен:

  1. Первый экземпляр ДОЛЖЕН получить параметр.
  2. Все следующие экземпляры имеют этот параметр как необязательный.

Если он не пройден, я буду использовать параметр предыдущего объекта init.

Для этого мне нужно разделить переменную между объектами (все объекты принадлежат классам с одним и тем же родителем).

Например:

class MyClass:
    shared_variable = None

    def __init__(self, paremeter_optional=None):
        if paremeter_optional is None:      # Parameter optional not given
            if self.shared_variable is None:
                print("Error! First intance must have the parameter")
                sys.exit(-1)
            else:
                paremeter_optional = self.shared_variable       # Use last parameter

        self.shared_variable = paremeter_optional        # Save it for next object

objA = MyClass(3)
objB = MyClass()  

Поскольку Переменная shared_variable не является согласованной / разделяемой для всех inits, при выполнении приведенного выше кода я получаю ошибку:

Error! First intance must have the parameter

(после второго инициализации objB)

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

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

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

class MyClass:
    def __init__(self, parameter):
        ...

objA = MyClass(3)
objB = MyClass(4)
objC = MyClass(5)
objD = MyClass(5)  # Be explicit; don't "remember" what was used for objC

Если objC и objD настолько «связаны», что objD может рассчитывать на инициализацию objC, и вы хотите быть DRY, использовать что-то вроде

objC, objD = [MyClass(5) for _ in range(2)]

Исходный ответ:

Я бы вообще не сделал это чем-то, что вы установили из экземпляра; это атрибут класса, поэтому его следует устанавливать только на уровне класса.

class MyClass:
    shared_variable = None

    def __init__(self):
        if self.shared_variable is None:
            raise RuntimeError("shared_variable must be set before instantiating")

        ...


MyClass.shared_variable = 3
objA = MyClass()
objB = MyClass()  
1 голос
/ 06 апреля 2020

Присвоение значения self.shared_variable делает self.shared_variable атрибутом экземпляра, чтобы значение не распределялось между экземплярами.

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

Изменение:

self.shared_variable = paremeter_optional

на:

self.__class__.shared_variable = paremeter_optional
...