Получение значения из атрибута объекта в отдельном файле - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь получить доступ к атрибуту из объекта, который я создал в отдельном файле Python.

Я пробовал следующий код:

print(self.GENOME[0][0].x)

, где self.GENOME[0][0] - адрес памяти объекта.

Однако я получаю

AttributeError: объект 'set' не имеет атрибута 'x'

agent.py:

 import neuron

 #Creates an array of custom shape (3,4,3) and assigns unique object 
 #address

 for ii in range(len(_Topology)):
      _Genome[ii] = [{neuron.Neuron()} for i in range(_Topology[ii]+1)]

 #Calls object variable
 print(self.GENOME[0][0].x)

neuron.py:

class Neuron:

    def __init__(self):
        self.x = 50

1 Ответ

0 голосов
/ 23 марта 2019

_Genome[ii] содержит список, который содержит набор по крайней мере для Neuron экземпляра.Упрощенно, вы можете сделать это так:

>>> a = [{Neuron()} for _ in [1,2]]
>>> a
[{<__main__.Neuron object at 0x0000000002CAFF28>}, {<__main__.Neuron object at 0x0000000002CAFF60>}]
>>> q = [a]
>>> q
[[{<__main__.Neuron object at 0x0000000002CAFF28>}, {<__main__.Neuron object at 0x0000000002CAFF60>}]]
>>>

Если вы напечатаете _Genome, это будет выглядеть примерно так - я предполагаю, что _Genome это список |q выше должно быть аналогично _Genome.

Индексация в нем выглядит следующим образом

>>> q[0]
[{<__main__.Neuron object at 0x0000000002CAFF28>}, {<__main__.Neuron object at 0x0000000002CAFF60>}]
>>> type(q[0])
<class 'list'>
>>> q[0][0]
{<__main__.Neuron object at 0x0000000002CAFF28>}
>>> type(q[0][0])
<class 'set'>
>>> 

Поведение набора хорошо документировано - как и большинство Python.

Один из способов доступа к содержимому набора - цикл for

>>> for thing in q[0][0]:
    print(thing.x)
50
>>> 

Другой способ доступа к содержимому набора - метод pop(), но это приведет к удалению произвольный элемент из набора.Я не думаю, что вы действительно этого хотите - вы не можете контролировать, какой предмет вы получаете, если их более одного, а в оригинальном наборе на один предмет меньше.

>>> x = [[{Neuron()},{Neuron}]]
>>> t = x[0][0].pop()
>>> t
<__main__.Neuron object at 0x0000000002C2F2E8>
>>> t.x
50
>>> x
[[set(), {<class '__main__.Neuron'>}]]
>>>

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

>>> q
[[{<__main__.Neuron object at 0x0000000002CAFF28>}, {<__main__.Neuron object at 0x0000000002CAFF60>}]]
>>> z = list(q[0][0])
>>> z
[<__main__.Neuron object at 0x0000000002CAFF28>]
>>> z[0].x
50
>>>

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

>>> a = [Neuron() for _ in [1,2]]
>>> a
[<__main__.Neuron object at 0x0000000002C2FDD8>, <__main__.Neuron object at 0x0000000002CD00B8>]
>>> q = [a]
>>> q[0][0]
<__main__.Neuron object at 0x0000000002C2FDD8>
>>> type(q[0][0])
<class '__main__.Neuron'>
>>> q[0][0].x
50
>>>
...