Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2020 16:09:06

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Видимость Классов

у меня в коде возникла вот такая ситуация

 class A:
	B.func()
	@classmethod
	def func(cls):
		print("func_a")
class B:
	A.func()
	@classmethod
	def func(cls):
		print('func_b')
класс А,не видит класс В,чтобы воспользоваться его функцией
если поменять их местами класс В не увидит класс А

Как сделать так,чтобы они видели друг друга

Офлайн

#2 Сен. 6, 2020 16:22:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Видимость Классов

xam1816
Как сделать так,чтобы они видели друг друга
Придется вам для начала объяснить, зачем такие извращения понадобились



Офлайн

#3 Сен. 6, 2020 23:34:09

oDoDo
Зарегистрирован: 2020-05-05
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Видимость Классов

Питон выполняет код последовательно мне тут кто то писал) следовательно проблема решается по тупому вот так всё работает

 class B:
	@classmethod
	def func(cls):
		print('func_b')
class A:
	B.func()
	@classmethod
	def func(cls):
		print("func_a")
class B:
	A.func()
	@classmethod
	def func(cls):
		print('func_b')
А вообще конечно увидеть адекватное решение задачи)

Офлайн

#4 Сен. 6, 2020 23:54:54

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Видимость Классов

Ну поясните чем вас не устраивает вариант

 class A:
	@classmethod
	def func(cls):
		print("func_a")
class B:
	@classmethod
	def func(cls):
		print('func_b')
B.func()
A.func()



Офлайн

#5 Сен. 7, 2020 13:24:39

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Видимость Классов

FishHook
Придется вам для начала объяснить, зачем такие извращения понадобились
Пытаюсь понять как строить код на примере калькулятора
код типа такого

  
класс Логика:
фун сложить(а,б):
вернуть a+б

фун вычесть(а,б)
вернуть а-б
..........

фун калькуляция(а,действие,б)
а = Децимал(а)
б = Децимал(б)
результат = ""
если действие == "+":
результат = сложить(а,б)
.......
обновить_экран(стр(результат)
класс Приведение данных:
а =""
б = ""
действие =""

фун обработка(символ):
если символ в ("+","-")
действие = символ
иначе_если символ == "="
калькуляция(а,действие,б)
иначе:
если действие=="":
а += символ
иначе:
б += символ
...............
обновить_экран(ф"{a}{действие}{б}"

класс Интерфейс
экран = Лейбл(....)

фун обновить_экран(текст)
экран.конфиг(текст = текст)

кнопка = Баттен(текст=символ,команд = обработка(символ))

вот и получилось что класс Логики не знает о классе Интерфейс
а идея в том чтобы,части программы были независимы друг от друга,только передавали сообщения друг другу
а они у меня получается на разных этажах,а надо чтобы в одной комнате были
Если вас не затруднит могли бы Вы показать логику построения программы,чтобы программа была склонна к развитию.
Т.е как строить код,чтобы его не пришлось переписывать с нуля,чтобы добавить какую нибудь новую функцию

Отредактировано FishHook (Сен. 7, 2020 15:00:06)

Офлайн

#6 Сен. 7, 2020 15:18:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Видимость Классов

    
class Calculator(object):
  
    def __init__(self):
        self.stack = []
        self.action = None
  
    def push(self, value):
        self.stack.append(value)
  
    def pop(self):
        return self.stack.pop()
  
    def set_action(self, action):
        self.action = action
  
    def result(self):
        b = self.pop()
        a = self.pop()
        res = self.action.calculate(a, b)
        self.push(res)
        self.action = None
        return res
  
class Action(object):
    def calculate(self, a, b):
        raise NotImplementedError
  
class Plus(Action):
    def calculate(self, a, b):
        return a + b
  
class Minus(Action):
    def calculate(self, a, b):
        return a - b
  
class Program(object):
    key_mapping = {'+': Plus,
                         '-': Minus}
    def __init__(self):
        self.calculator = Calculator()
    def run(self):
        print('Welcome to calculator')
        while True:
            i = input('>>>')
            if i:
                if i in self.key_mapping:
                    action = self.key_mapping[i]()
                    self.calculator.set_action(action)
                elif i.isdigit():
                    self.calculator.push(int(i))
                else:
                    print('ERROR')
            else:
                print self.calculator.result()
program = Program()
program.run()
  



Отредактировано FishHook (Сен. 7, 2020 15:19:11)

Офлайн

#7 Сен. 7, 2020 21:27:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Видимость Классов

xam1816
Пытаюсь понять как строить код на примере калькулятора
код типа такого
Хорошо, что ты используешь псевдокод. Плохо, что в твоём псевдокоде так много деталей. Псевдокод и нужен как раз для того, чтобы не тратить время на детали. То есть там, где в обычном коде стоит двоеточие, в псевдокоде этого двоеточия быть не должно. Псевдокод просто должен быть однозначно понятен, в нём просто не должно быть двусмысленностей - и это единственное требование. Так что очень сильно бросилось в глаза, насколько много деталей в твоём псевдокоде. Псевдокод должен быть таким, чтобы переписывать его было совсем не напряжно. Тем он и отличается от конечного кода. Конечный код очень напряжно переписывать сто раз, тогда как псевдокод ты спокойно сто раз перепишешь. Для этого он и нужен. Нужно сделать 100500 набросков кода и выбрать из них самый лучший. Причём делается это легко и быстро, благодаря отсутствию синтаксических нюансов, которые есть уже в реальном коде. А уже потом, когда выбран самый лучший вариант кода на псевдокоде, его можно реализовать со всем синтаксисом уже в реальном коде со всеми запятыми, точками, двоеточиями и так далее, что и занимает время.



Отредактировано py.user.next (Сен. 7, 2020 21:28:48)

Офлайн

#8 Сен. 7, 2020 21:37:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Видимость Классов

FishHook
  
class Program(object):
    key_mapping = {'+': Plus,
                         '-': Minus}
    def __init__(self):
        self.calculator = Calculator()
Тут нарушил букву D из SOLID.

Как исправить - сделай агрегацию вместо композиции.

  
class Program(object):
    key_mapping = {'+': Plus,
                         '-': Minus}
    def __init__(self, calculator):
        self.calculator = calculator

Такимо образом класс Program не знает, какой калькулятор существует в коде. Он просто ожидает, что ему дадут что-то похожее на калькулятор и он сможет этим чем-то пользоваться уже известным ему способом.
Инверсия зависимостей - это перенос зависимостей снаружи внутрь. Program становится зависим не от какого-то класса снаружи, который может меняться и не предупреждать об этом, а от какого-то интерфейса внутри себя, который кто-то снаружи должен будет просто соблюсти перед входом.



Офлайн

#9 Сен. 7, 2020 22:43:44

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Видимость Классов

py.user.next
py.user.next
FishHook
FishHook
Спасибо,изучаю

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version