<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote"><br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think the proposal, so far, seems to confuse two separate things.  One is attaching a method to a class after definition.  The second is attaching a method to an instance after creation.  Or at least it is unclear to me which of those is the intention, since both seem to occur in the examples.  Or maybe it's both, but those feel like fairly different use cases.</div></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Aren't they the same though? Remember that classes are instances of type and methods are just their attributes. We're simply using setattr() in both cases: with instances, and with classes (=instances).</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div class="quoted-text"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="auto"><div dir="auto">  @decorate(MyClass)</div><div dir="auto">  def MyClass.method(self, other: MyClass) -> List[MyClass]:</div></div></div></blockquote><div><br></div></div><div>In this case, the syntax is 100% superfluous.  One can simply write:</div><div><br></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div class="gmail_extra"><div class="gmail_quote"><div>  @decorate(MyClass)</div></div></div></div><div><div class="gmail_extra"><div class="gmail_quote"><div>  def method(self, other: MyClass) -> List[MyClass]:</div><div><br></div></div></div></div></blockquote><div><div class="gmail_extra"><div class="gmail_quote"><div>The class is already mentioned in the decorator.  If the intention is to add the method to the class, that's fine, and something a decorator can do.  Perhaps the spelling for this decorator-factory could be `enhance`.  Or more verbosely `inject_method`.  Spelling aside, the syntax adds nothing.</div></div></div></div></div></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">I think you missed the point, the decorator was just an example and has arbitary functionality. The point is that you can not refer the class itself in its body, so you can't do either of these methods:</div><div dir="auto"><br></div><div dir="auto">  class Foo:</div><div dir="auto"><br></div><div dir="auto">      def concenate(self, other: Foo) -> Foo:</div><div dir="auto">          ...</div><div dir="auto"><br></div><div dir="auto">      @just_an_example_decorator(mapper=Foo)</div><div dir="auto">      def map(self) -> dict:</div><div dir="auto">          ...</div><div dir="auto"><br></div><div dir="auto">Because Foo is not defined at the time of executing the function headers. The proposed feature would allow you to easily define these after the class definition and allow refering to the class directly.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div class="gmail_extra"><div class="gmail_quote"><div class="quoted-text"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="auto"><div dir="auto">  my_menu = Menu(['Pizza', 'Cake', 'Pasta'])<br></div><div>  def my_menu.select_callback(item_i<wbr>ndex):</div><div>      if item_index == 0:  # Pizza</div><div>          serve_food(pizza)</div><div>      else:  # Cake or Pasta</div><div>          ...</div></div></div></blockquote><div><br></div></div><div>Attaching to the instance is fine too.  But I prefer the current spelling so far:</div><div><br></div></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div class="gmail_extra"><div class="gmail_quote"><div><div>my_menu1 = Menu(['Pizza', 'Cake', 'Pasta'])</div></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div class="gmail_extra"><div class="gmail_quote"><div>my_menu2 = Menu(...)</div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div class="gmail_extra"><div class="gmail_quote"><div><br></div></div></div></div><div><div class="gmail_extra"><div class="gmail_quote"><div><div>def callback1(self, ...):</div></div></div></div></div><div><div class="gmail_extra"><div class="gmail_quote"><div><div>    ...</div></div><div><div><div class="gmail_extra"><div class="gmail_quote">def callback2(self, ...):</div></div></div><div><div class="gmail_extra"><div class="gmail_quote">    ...</div><div class="gmail_quote"><br></div></div></div><div><div class="gmail_extra"><div class="gmail_quote"><div></div></div></div></div></div></div></div></div><div><div class="gmail_extra"><div class="gmail_quote"><div><div>my_menu1.callback = callback2</div></div></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div class="gmail_extra"><div class="gmail_quote"><div>my_menu2.callback = callback1</div></div></div></div></blockquote></div></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">I don't, it is repeating the variable name three times. I don't see how this differs from decorator syntax, do you prefer the old way on that too, or am I missing something?</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra" dir="auto"><div class="gmail_quote"><div>Under the current approach, you can flexibly define callbacks outside of the scope of any particular instance or class, and attach them as needed to instances.  Obviously the new syntax would not *remove* this option, but it would cover only a narrow subset of what we can already do... and the way we do it now feels much better self-documenting</div></div></div></div></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">I think you answered yourself here, this would not remove the existing flexible way. Just like @decorator syntax didn't remove the more flexible way. Honestly this is in my opinion almost one-to-one comparable with decorator syntax, and I don't think anyone here dares to claim decorators aren't awesome.</div><div dir="auto"><br></div><div dir="auto">- Markus</div><div dir="auto"></div></div>