[Python-ideas] Fwd: Define a method or function attributeoutsideof a class with the dot operator

Steven D'Aprano steve at pearwood.info
Mon Feb 13 20:06:57 EST 2017


On Sun, Feb 12, 2017 at 10:29:10PM +0100, Nick Coghlan wrote:
[...]
> Method injection is most attractive to me as a potential alternative
> to mixin classes that has fewer runtime side effects by moving more of
> the work to class definition time.
> 
> More philosophically though, it offends my language design
> sensibilities that we have so much magic bound up in class definitions
> that we don't expose for procedural access post-definition time -
> there's a whole lot of behaviours that "just happen" when a method is
> defined lexically inside a class body that can't readily be emulated
> for callables that are defined outside it.

If the OP is willing to write a PEP, I think it is worth taking a 
three-part approach:

- expose the class definition magic that Nick refers to;

- which will allow writing a proper inject_method() decorator;

- or allow def Class.method syntax.

I think I would prefer 

def Class.method ...

over

@inject_method(Class)
def method ...
del method

but given how high the barrier to new syntax is, perhaps we should be 
willing to take the decorator approach and leave the syntax for the 
future, once people have got used to the idea that extension methods 
won't cause the fall of civilization as we know it :-)


> However, even with that, I'm still only +0 on the idea - if folks
> really want it, `types.new_class` can already be used to creatively to
> address most of these things, and it's not exactly a problem that
> comes up very often in practice.

Swift and Objective-C users might, I think, disagree with that: they 
even have a term for this, "swizzling". This is part of the 
"Interceptor" design pattern:

https://en.wikipedia.org/wiki/Interceptor_pattern



-- 
Steve


More information about the Python-ideas mailing list