Donn Ingle a écrit : >>>I thought this might be a case for multiple inheritance >> >>??? > > Well, in terms of having Canvas and Thing inherit from Stack and thereby > (somehow, not sure how) they would both have access to Stack.stack (a list) > > >>wrt/ all Thing instances having to refer to a same Stack instance, >>there's a pretty obvious answer: make the Stack instance an attribute of >>class Thing, ie: >>class Thing(object): >> stack = Stack() >> >> def some_method(self, val): >> self.stack.push(val) >> # etc... > > > No can do: > Canvas ---> Stack <--- Thing
Sorry but you're exemple is using classes, not instances. So while *you* may know what you mean, it's not decidable for me. > Both Canvas and Thing have to use the same Stack. You mean: both Canvas class and Thing class have to use the same Stack Class ? Or : for all Canvas instances and all Thing instances, there must be only one same Stack instance ? Or: a given (Canvas instance, Thing instance) couple must share a same Stack instance ? Or (etc...) > It gets things pushed onto > it by them both. Both what ? classes ? instances ?-) > >>Now the point that isn't clear is the exact relationship between Stack >>and Canvas. You didn't give enough details for any answer, advice or >>hint to make sens. > > Sorry, didn't want to write an overly long post. There's certainly a balance between being overly vague and being overly long !-) > a Canvas holds many Things (graphics) and it pushes each Thing onto the > Stack. The Things also push data onto the same Stack. After that the Stack > pops and draws each Thing to the screen. > > What I'm asking about is subtle and I don't know how to word it: how can > Classes I guess you mean "instances", not "classes". > share common objects without using global variables specifically > named within them? Err...Perhaps a dumb question, but what about passing the "common objects" to initializers ? > ## == API in another module perhaps === > Class Stack: > def push(self,stuff): > pass > > Class Canvas: > def do(self): > s.push("data") #I don't feel right about 's' here. > > Class Thing: > def buzz(self): > print s.pop(0) > > ## == User space code area === > s = Stack() #I want to avoid this direct naming to 's' > c = Canvas() > c.push("bozo") > t = Thing() > t.buzz() # API land class Stack(object): # ok, we all know what a stack is class Canvas(object): def __init__(self, stack): self.stack = stack def do(self): self.stack.push("data") class Thing(object): def __init__(self, stack): self.stack = stack def buzz(self): print self.stack.pop(0) # Userland s = Stack() c = Canvas(s) t = Thing(s) c.do() t.buzz() HTH -- http://mail.python.org/mailman/listinfo/python-list