Я хочу использовать список из класса в другом классе, но я не могу достичь указанной цели - PullRequest
0 голосов

Итак, я занимаюсь проектом, и мне нужно сослаться в классе на список, принадлежащий другому классу, вот что я получил до сих пор:

import pandas as pd
import numpy as np

data = pd.read_excel(r'D:\Coisas fixes\London.connections.xlsx')
df = pd.DataFrame(data, columns=['station1', 'station2'])

data2 = pd.read_excel(r'D:\Coisas fixes\London.stations.xlsx')
df2 = pd.DataFrame(data2, columns=['id', 'name'])


class testing_tests:

    def __init__(self):
        self.edge = []
        self.vector = []
        np_array = df.to_numpy()
        for i in np_array:
            no1, no2 = i
            self.edge.append((no1, no2))
        print(self.edge)


class Edge:

    def __init__(self):
        for i in range(len(testing_tests.edge)):
            self.v1 = df.iloc[i, 0]
            self.v2 = df.iloc[i, 1]

В основном происходит то, что я создаю программа для чтения файла excel, что мне удалось сделать, и сохранить некоторые значения в новом классе, но я не выясняю способ доступа к списку в другом классе, вот что я написал на консоли python.

c = testing_tests()
-[(11, 163), (11, 212), (49.........
E = Edge()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:/Users/vasco/Downloads/Ze wrk.py", line 26, in __init__
    for i in range(len(testing_tests.edge)):
AttributeError: type object 'testing_tests' has no attribute 'edge'

Я поставил несколько точек, потому что результат похож на 400 чисел. Кто-нибудь знает, что делать? Вся помощь приветствуется

1 Ответ

0 голосов
/ 27 мая 2020
c = testing_tests()

Здесь вы создаете экземпляр класса testing_tests и назначаете этот экземпляр c. __init__ запустится для инициализации экземпляра класса, настроив список self.edge (c.edge).

Но внутри вашего Edge класса у вас есть

for i in range(len(testing_tests.edge)):

Здесь вы не используете свой экземпляр, вы ссылаетесь непосредственно на класс testing_tests (а не на его экземпляр). Класс (похожий на шаблон) не имеет атрибута edge. Это есть только у экземпляров класса.

Одно из решений - создать экземпляр внутри Edge, например,

class Edge:
    def __init__(self):
        self.tt = testing_tests()
        for i in range(len(self.tt.edge)):

В стороне, такая путаница между классами и их экземплярами - это хорошо. пример того, почему использование соглашения об именах может сделать код более читаемым. Если вы используете CamelCase для имен своих классов, легче обнаружить проблему такого рода. Например,

class TestingTests:
    def __init__(self):
        self.edges = []
        np_array = df.to_numpy()
        for i in np_array:
            no1, no2 = i
            self.edges.append((no1, no2))
        print(self.edges)

class Edge:
    def __init__(self):
        self.tt = TestingTests()
        for i in range(len(self.tt.edges)):
            self.v1 = df.iloc[i, 0]
            self.v2 = df.iloc[i, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...