13

I recently was working on a little python project and came to a situation where I wanted to pass self into the constructor of another object. I'm not sure why, but I had to look up whether this was legal in python. I've done this many times in C++ and Java but I don't remember ever having to do this with python.

Is passing references to self to new objects something that isn't considered pythonic? I don't think I've seen any python programs explicitly passing self references around. Have I just happen to not have a need for it until now? Or am I fighting python style?

3
  • Um, few things are unpythonic per se, it's just that there are usually better approaches (whether on a design or implementation level). Your questions doesn't name the problem, so we can't judge whether your solution is any good. Commented Oct 15, 2010 at 20:38
  • Now that I think about it, I have to agree, this doesn't get done as much in Python as in e.g. Java. No idea why, though. Commented Oct 15, 2010 at 20:39
  • I don't know why people insist on saying "pythonic" when they simply mean "clean", but there's nothing inherently wrong with this. Just watch out for circular references and __del__. Commented Oct 15, 2010 at 21:07

2 Answers 2

18

Yes it is legal, and yes it is pythonic.

I find myself using this pattern when you have an object and a container object where the contained objects need to know about their parent.

Sign up to request clarification or add additional context in comments.

4 Comments

Yeah I understand why you need to do it, but I'm just not sure why I haven't seen it done very much in python.
Possibly because python has a wicked set of polymorphic container types which in general are sufficient for all your needs?
Can adapter pattern be considered one of the uses, I mean if we don't consider parameter to be passed as self but another object instance which has to be contained.
@Nick - I’m pretty late to the party here, but please could you explain what you mean by polymorphic container types, and why they are relevant?
4

Just pass it like a parameter. Of course, it won't be called self in the other initializer...

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

2 Comments

I think this is more or less asking whether its pythonic, not how.
super confusing.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.