Доступ к списку, который находится внутри функции, которая находится внутри класса - PullRequest
1 голос
/ 24 марта 2020

Предположим, у меня есть такой класс в файле a.py:

class MyClass():
    def get(self, request, format='json'):
        pipeline = ['something_here']

Как мне получить доступ к списку pipeline из другого файла, например b.py?
a.py и b.py находятся в одном каталоге.

Я пытаюсь что-то вроде этого:

from a import MyClass

my_list = MyClass.pipeline

ОБС .: Я не могу изменить файл a.py, потому что другие люди используют его.

Ответы [ 3 ]

3 голосов
/ 24 марта 2020

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

2 голосов
/ 24 марта 2020

Поскольку вы не можете изменить a.py, получить доступ к этому списку невозможно. Этот список должен быть объявлен как элемент данных MyClass, или его необходимо вернуть из MyClass.get(). В противном случае это невозможно

1 голос
/ 24 марта 2020

Одним из решений этой проблемы является использование наследования и просто изменение логики c для MyClass внутри нового класса.

С учетом следующего содержимого a.py:

class MyClass:
    def __init__(self, x,y,z):
        self.x = x
        self.y = y
        self.z = z

    def get(self, somestring):
        pipeline = [somestring]
        return pipeline

Создание нового объекта MyClass и вызов get("somestring") вернет список, содержащий только эту строку. Однако мы не устанавливаем свойство внутри класса, поэтому оно доступно только внутри самого метода.

Создание нового файла, в данном случае b.py, мы можем создать новый класс, наследуя от первый класс, и просто измените метод get, чтобы получить логин c, который мы хотим.

from a import MyClass

class MyNewClass(MyClass):
    def get(self, somestring):
        self.pipeline = [somestring]

Внутри b.py мы можем затем выполнить следующий тест:

old = MyClass(1,2,3)
print(old.x, old.y, old.z)
print(old.get("this is the input-string"))

new = MyNewClass(4,5,6)
print(new.x, new.y, new.z)
new.get("This is the second input-string")
print(new.pipeline)

Выход:

1 2 3
['this is the input-string']
4 5 6
['This is the second input-string']
...