существует ли хороший шаблон проектирования для этого отношения классов в Python?

#python #class #design-patterns

Вопрос:

Итак, представьте, что у меня есть класс A, и класс B может принять класс A в качестве своего члена и использовать функции класса A для выполнения этой работы, например

  class B:
    def __init__(self, A):
        self.A = A

    def do_something(self):
        # some other jobs ....
        self.A.do_the_job()
 

Это простой дизайн. Однако в моем случае класс A также может быть доступен и изменен за пределами B, тогда этот дизайн немного странный, потому что, хотя A является классом-членом B, на самом деле A может изменять свой статус за пределами B. Поэтому я меняю его на этот дизайн

  class B:
    def __init__(self):
        pass

    def do_something(self, A):
        # some other jobs ....
        A.do_the_job()
 

Это определенно прекрасно, единственное уродство в том, что прямо сейчас каждый раз , когда я звоню B.do_something , мне нужно передавать класс A в качестве аргумента. На самом деле класс B имеет несколько других функций, которые также будут использовать класс A.

Интересно, есть ли какой-нибудь лучший шаблон дизайна для решения подобных ситуаций?

Комментарии:

1. В вашем втором примере нельзя A все еще изменить перед вызовом B.do_something(A) ? Если do_the_job() это документированная функция A , то вы должны быть в состоянии на это рассчитывать. Если вы не можете, чему вы можете доверять?

2. В чем ваша проблема с тем фактом, что экземпляр A может измениться вне класса? Если вы хотите избежать передачи a (экземпляра A ) в качестве параметра, используйте верхний дизайн и четко задокументируйте этот параметр в строке документа функции.

3. Ваш первый дизайн совсем не странный. Рассмотрим file = open('test'); reader = csv.reader(file) те же отношения. В Python это всегда возможно.

4. Если вы не хотите self.A , чтобы вас выводили из класса, не принимайте A в качестве параметра. Создайте A экземпляр в __init__ методе.

5. Изменение класса outsinde B также приведет к изменению класса, в котором хранится, B поскольку обе операции будут работать с одним и тем же экземпляром A . Но вы, скорее всего, знаете об этом. Если вы не хотите такого поведения, вы можете создать экземпляр A в __init__ из B , чтобы он был эксклюзивным для B .

Ответ №1:

Это довольно просто:

 class A:
    def do(self):
        print(“Hello from A”)
class B:
    def run(self):
        A().do()
        print(“Now in B”)

 

Так что да, вы можете просто получить доступ к одному классу в другом таким образом. Помните, что если ваши классы находятся в разных файлах, вы должны использовать такую строку:

 from mymodule import A
 

и это тоже будет работать