Класс «Мои персоны» позволяет человеку определять номер, указывающий на друзей.
Когда я делаю первого человека, я не могу поставить кого-то из друзей в список людей, потому что эти друзья еще не были созданы как люди.
Таким образом, я инициализирую всех друзей как «Нет»
Однако, как только друг был установлен, я не хочу его менять.
Когда кто-то пытается перейти, например, к bob.friends [2] = john, он должен выдать ошибку, если bob.friends [2]! = Нет.
Используя pythons @property decorator, я знаю, как управлять настройкой отдельных переменных. Однако я не знаю, как использовать @property для управления настройкой элементов в массиве.
Вот мои попытки до сих пор:
class person1():
def __init__(self,name):
self.name=name
self.friends={1:None,2:None,3:None,4:None}
rob=person1('rob')
if rob.friends[1] is None: #I want this check to be done within the class using a property.
rob.friends[1]="sarah"
#I just want to go: rob.friends[1]="sarah" and get an error if friends[1] isn't None.
#Solution1 was to make my own dict, however I was hoping to instead use @property instead of needing my own dict:
class robs_dict(dict):
def __setitem__(self,i,j):
assert(i in self)
assert(self[i] is None)
dict.__setitem__(self,i,j)
class person2():
def __init__(self,name):
self.name=name
self.friends=robs_dict({1:None,2:None,3:None,4:None})
rob=person2('rob')
rob.friends[2]='sarah'
rob.friends[2]='sarah2' #error
#^ solution one achieves what I want, but I want to know if it's possible to use @property instead...
#solution2, unfortunatly isn't scalable if i have many friends..I would have to write many lines of code. Also one could still edit self.friends directly..:
class person3():
def __init__(self,name):
self.name=name
self.friends={1:None,2:None,3:None,4:None}
@property
def friend1(self):
return self.friends[1]
@friend1.setter
def friend1(self,value):
assert(self.friends[1] is None)
self.friends[1]=value
@property
def friend2(self):
return self.friends[2]
@friend2.setter
def friend2(self,value):
assert(self.friends[2] is None)
self.friends[2]=value
rob=person3('rob')
rob.friend1='sarah'
rob.friend1='sarah2' #error
#so basically, i need to improve solution 2 so that I can still use rob.friends as in solution 1, but using properties. is this possible?
Приветствуется любая помощь по использованию свойств, или приветствуются любые альтернативные решения, не использующие свойства. Я предполагаю, что это обычная проблема, не позволяющая инициализировать значения при запуске из-за зависимости от других значений, которые не были инициированы.