У меня есть класс с атрибутами, которые имеют ссылку на другой атрибут этого класса.См. Класс Device
, value1
и value2
, содержащий ссылку на interface
:
class Interface(object):
def __init__(self):
self.port=None
class Value(object):
def __init__(self, interface, name):
self.interface=interface
self.name=name
def get(self):
return "Getting Value \"%s\" with interface \"%s\""%(self.name, self.interface.port)
class Device(object):
interface=Interface()
value1=Value(interface, name="value1")
value2=Value(interface, name="value2")
def __init__(self, port):
self.interface.port=port
if __name__=="__main__":
d1=Device("Foo")
print d1.value1.get() # >>> Getting Value "value1" with interface "Foo"
d2=Device("Bar")
print d2.value1.get() # >>> Getting Value "value1" with interface "Bar"
print d1.value1.get() # >>> Getting Value "value1" with interface "Bar"
Последняя печать неверна, потому что d1
должен иметь интерфейс "Foo".Я знаю, что происходит не так: строка interface=Interface()
строка выполняется, когда определение класса анализируется (один раз).Таким образом, каждый Device
класс имеет один и тот же экземпляр interface
.
. Я мог бы изменить класс Device
на:
class Device(object):
interface=Interface()
value1=Value(interface, name="value1")
value2=Value(interface, name="value2")
def __init__(self, port):
self.interface=Interface()
self.interface.port=port
Так что это также не работает: значения по-прежнемуесть ссылка на исходный экземпляр интерфейса, а self.interface - это просто еще один экземпляр ...
Вывод теперь таков:
>>> Getting Value "value1" with interface "None"
>>> Getting Value "value1" with interface "None"
>>> Getting Value "value1" with interface "None"
Итак, как я могу решить это с помощью питона?Я мог бы настроить функцию в классе Device
для поиска атрибутов с типом Value
и переназначить их новому интерфейсу.Разве это не распространенная проблема с типичным решением для него?
Спасибо!