On 2017-10-28 11:31 PM, Koos Zevenhoven wrote:
On Sat, Oct 28, 2017 at 11:24 PM, Soni L. <fakedme...@gmail.com <mailto:fakedme...@gmail.com>>wrote:


    On 2017-10-28 02:51 PM, Steven D'Aprano wrote:


        You ignored my question: Is that the sort of thing you mean by
        composition? If not, then what do you mean by it? This is not a
        rhetorical question: I'm having difficulty understanding your
        proposal.
        It is too vague, and you are using terminology in ways I don't
        understand.

        Maybe that's my ignorance, or maybe you're using non-standard
        terminology. Either way, if I'm having trouble, probably
        others are too.
        Help us understand your proposal.



I have to say I'm almost impressed by the constructiveness of the discussion, even though​ I still don't understand the point of all the square brackets in the proposal.

    With composition, you can have car.key.turn() call
    car.ignition.start(), without having to add car to key or ignition
    to key. You just have to put both in a car and they can then see
    eachother!


Here it's a bit confusing that the key is thought of as part of the car. It's easy to imagine that an owner of two cars would want the same key to work for both of them. Or that one car could have multiple users with non-identical keys. I'm not sure if these things already exist in real life, but if not, it's probably just a matter of time.

But let's ignore this confusion for a moment, and imagine that the example makes perfect sense. Now, it sounds like you want something like namespacing for methods and attributes within a complicated class. Maybe you could implement it using nested classes and decorators to make sure 'self' is passed to to the methods in the way you want. The usage might look roughly like:

@namespacedclass
class Car:
@classnamespace
    class ignition:
        def start(self):
             ...

@classnamespace
    class key:
        def turn(self):
self.ignition.start()


Another concern regarding the example, however, is that this seems to make it unclear what the public API of the car is. It looks like you can just as easily drive the car without having the key: just call car.ignition.start().

It's a crap example, yes.

But you should be able to do things like

car = object()
car[Engine] = SimpleEngine()
car.[Engine].kickstart() # calls kickstart method with an instance of SimpleEngine as `self`/first argument and `car` as second argument.
# etc

Which your decorator-based approach quite obviously doesn't let you.
​

-- Koos


--
+ Koos Zevenhoven + http://twitter.com/k7hoven +

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to