Получить ссылку и вызвать функцию экземпляра класса, не зная его имени

505 просмотра
0
0 Комментариев

Передо мной стоит две задачи:

  • Получить ссылку на атрибут экземпляра первого класса из второго класса.

  • Вызвать функцию первого класса из второго класса.

    Быть может что-то типа @staticlass?

    Архитектура такая:

    class secondclass:
        def __init__(self, file):
            try:
                local_data = wt.find_keys(self.h)
                for chunk in local_data:
                    if chunk not in firstclass.ignored_data: # нужно обратиться к firstclass.ignored_data
                        if wt.is_alive(chunk):
                            pass
                        else:
                            pass
     
            except KeyboardInterrupt:
                print(colored('Second class breaking', 'red'))
                firstclass.dumpjson() # нужно вызвать эту функцию
     
    class firstclass:
        def __init__(self, file, start=False):
            ld = secondclass(file)
            self.ignored_data
            # далее init
     
    def analyze(self):
        pass
     
    def updatedata(self, flag, data):
        pass
     
    def step(self, data):
        # шаг
        ld = secondclass(data)
        # работа в шаге
        self.walk()
     
    def walk(self):
        pass
     
    def dumpjson(self, path=None, filename=None):
        pass
    


  • Добавить комментарий

    2 Answers

    Python Опубликовано 12.12.2018
    0

    class FirstClass:
        def __init__(self):
            self.second = SecondClass(first=self)
            self.data = dict(good=set(), bad=set(), ignored=set((0, 4)))
     
    class SecondClass:
        def __init__(self, first):
            self.first = first
     
        def processing(self, data):
            '''получает и обрабатывает данные'''
            storage = self.first.data
            if data not in storage['ignored']:
                try:
                    result = data + 100
                    if not result % 2:
                        storage['ignored'].add(data)
                except:
                    storage['bad'].add(data)
                else:
                    storage['good'].add(result)
     
     
    if __name__ == '__main__':
        first = FirstClass()
     
        for data in [0, 1, '2', 3, 4, '5', 6]:
            first.second.processing(data)
     
        for k in first.data:
            print('{} : {}'.format(k, first.data[k]))
     
        # good: {106, 101, 103}
        # bad: {'2', '5'}
        # ignored: {0, 4, 6}
    

    Добавить комментарий
    0

    Не обязательно знать имя. Можно передавать self объекта, как ссылку на экземпляр класса.

    Пускай у нас есть firstclass и secondclass.

    # основной класс
    class firstclass:
        def __init__(self, data):
            self.data = data
            sc = secondclass(self) # передаём в class_link ссылку вида
            # <__main__.firstclass object at 0x7f570cc2c198>
            # равносильно: sc = secondclass(class_link=self)
            # где self - <__main__.firstclass object at 0x7f570cc2c198>
     
    # дополнительный класс
    class secondclass:
        def __init__(self, class_link):
            self.fc_link = class_link
            self.data = self.fc_link.data # получаем ссылку на data экземпляра класса firstclass
            print(self.data) # выводим data в аутпут
            print(self.data == self.fc_link.data) # True
            self.data = 'Hello buddy' # сменяем локальное значение data
            print(self.data) # выводим data в аутпут
            print(self.data == getattr(self.fc_link, 'data')) # False
            # запрос выше равносилен self.data == self.fc_link.data
     
    x = firstclass('Hello world')
    

    Добавить комментарий
    Напишите свой ответ на данный вопрос.
    Scroll Up