#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
и это тоже будет работать