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

Как сделать так,чтобы они видели друг друга
FishHook
xam1816
Как сделать так,чтобы они видели друг друга
Придется вам для начала объяснить, зачем такие извращения понадобились
oDoDo
Питон выполняет код последовательно мне тут кто то писал) следовательно проблема решается по тупому вот так всё работает
 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')
А вообще конечно увидеть адекватное решение задачи)
doza_and
Ну поясните чем вас не устраивает вариант
 class A:
	@classmethod
	def func(cls):
		print("func_a")
class B:
	@classmethod
	def func(cls):
		print('func_b')
B.func()
A.func()
xam1816
FishHook
Придется вам для начала объяснить, зачем такие извращения понадобились
Пытаюсь понять как строить код на примере калькулятора
код типа такого

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

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

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

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

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

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

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

вот и получилось что класс Логики не знает о классе Интерфейс
а идея в том чтобы,части программы были независимы друг от друга,только передавали сообщения друг другу
а они у меня получается на разных этажах,а надо чтобы в одной комнате были
Если вас не затруднит могли бы Вы показать логику построения программы,чтобы программа была склонна к развитию.
Т.е как строить код,чтобы его не пришлось переписывать с нуля,чтобы добавить какую нибудь новую функцию
FishHook
    
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()
  
py.user.next
xam1816
Пытаюсь понять как строить код на примере калькулятора
код типа такого
Хорошо, что ты используешь псевдокод. Плохо, что в твоём псевдокоде так много деталей. Псевдокод и нужен как раз для того, чтобы не тратить время на детали. То есть там, где в обычном коде стоит двоеточие, в псевдокоде этого двоеточия быть не должно. Псевдокод просто должен быть однозначно понятен, в нём просто не должно быть двусмысленностей - и это единственное требование. Так что очень сильно бросилось в глаза, насколько много деталей в твоём псевдокоде. Псевдокод должен быть таким, чтобы переписывать его было совсем не напряжно. Тем он и отличается от конечного кода. Конечный код очень напряжно переписывать сто раз, тогда как псевдокод ты спокойно сто раз перепишешь. Для этого он и нужен. Нужно сделать 100500 набросков кода и выбрать из них самый лучший. Причём делается это легко и быстро, благодаря отсутствию синтаксических нюансов, которые есть уже в реальном коде. А уже потом, когда выбран самый лучший вариант кода на псевдокоде, его можно реализовать со всем синтаксисом уже в реальном коде со всеми запятыми, точками, двоеточиями и так далее, что и занимает время.
py.user.next
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 становится зависим не от какого-то класса снаружи, который может меняться и не предупреждать об этом, а от какого-то интерфейса внутри себя, который кто-то снаружи должен будет просто соблюсти перед входом.
xam1816
py.user.next
py.user.next
FishHook
FishHook
Спасибо,изучаю
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB