2010-10-15 5 views
7

Недавно я работал над небольшим проектом python и пришел к ситуации, когда я хотел передать self в конструктор другого объекта. Я не уверен, почему, но мне пришлось искать, является ли это законным в python. Я делал это много раз в C++ и Java, но я не помню, когда-либо делал это с помощью python.Передача себя в конструктор в python

Передает ссылки на self новым объектам что-то, что не считается pythonic? Я не думаю, что видел какие-либо программы python, явно передающие собственные ссылки. Разве я до сих пор не нуждаюсь в этом? Или я борюсь с питонским стилем?

+0

Гм, несколько вещей unpythonic * сама по себе *, это просто, что есть * обычно * лучше всего подходит (будь то дизайн или уровень реализации). Ваши вопросы не назовут проблему, поэтому мы не можем судить, хорошо ли ваше решение. – delnan

+0

Теперь, когда я думаю об этом, я должен согласиться, это не делается так, как в Python, как, например, Ява. Не знаю, почему. –

+0

Я не знаю, почему люди настаивают на том, чтобы сказать «pythonic», когда они просто означают «чистые», но в этом нет ничего неправильного. Просто следите за циркулярными ссылками и '__del__'. –

ответ

12

Да, это законно, и да, это питонический.

Я считаю, что использую этот шаблон, когда у вас есть объект и объект-контейнер, где содержащиеся объекты должны знать об их родительском.

+0

Да, я понимаю, зачем вам это нужно, но я просто не уверен, почему я не видел, чтобы это очень сильно делалось на питоне. – Falmarri

+1

Возможно, потому что у python есть злой набор полиморфных типов контейнеров, которые в целом достаточны для всех ваших потребностей? –

+0

Может ли шаблон адаптера считаться одним из видов использования, я имею в виду, если мы не рассматриваем параметр, который должен передаваться как * self *, а другой экземпляр объекта, который должен содержаться. – Ashish

1

Просто передайте его как параметр. Конечно, это не будет называться в другом инициализаторе self ...

class A: 
    def __init__(self, num, target): 
     self.num = num 
     self.target = target 

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

a = A(1) 
b = B(2) 
print b.a.num # prints 2 
+0

Я думаю, что это более или менее спрашивает, есть ли его _pythonic_, а не как. – alternative