Not having to rewrite 'obj.' on each line - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Not having to rewrite 'obj.' on each line (/thread-13131.html) |
Not having to rewrite 'obj.' on each line - beuaaa - Sep-29-2018 Let's say I have this class: class MyNewClass: def func1(self): print('something to do') def func2(self): print('other thin to do')The normal syntax to call methods of this class is: obj = MyNewClass() obj.func1() obj.func2()I would like to do exactly the same thing but without having to rewrite 'obj.' on each line as in this imaginary syntax: obj = MyNewClass() using obj: func1() func2()Does Python allow you to write this kind of code? RE: Not having to rewrite 'obj.' on each line - gruntfutuk - Sep-29-2018 No. Even using a context manager, you'd just be substituting. Obviously you could create a function that could take a class/instance and call methods for that. Examples on SO. Are you trying to save on typing? RE: Not having to rewrite 'obj.' on each line - micseydel - Sep-29-2018 You can do something terrible like this from copy import copy class Greeter: def __init__(self, to): self.to = to def hello(self): return "Hello, {}!".format(to) class Magic: def __init__(self, instance, enclosing_locals): self.instance = instance self.enclosing_locals = enclosing_locals self.origin_enclosing_locals = copy(enclosing_locals) def __enter__(self): for key in dir(self.instance): self.enclosing_locals[key] = getattr(self.instance, key) def __exit__(self, type, value, traceback): for key in list(self.enclosing_locals.keys()): del self.enclosing_locals[key] self.enclosing_locals.update(self.origin_enclosing_locals) with Magic(Greeter("world"), locals()): print(hello())I bet there's a way to not require the locals() call but I couldn't figure it out in a few minutes' Googling. Note that I'm messing with scopes such that any new variables defined within the with-block which would normally be available after the block, won't be. Anyone familiar with Python reading your code would be confused unnecessarily. RE: Not having to rewrite 'obj.' on each line - Larz60+ - Sep-30-2018 you can also keep you class in a separate file, then if there's a method that you use a lot, import like: from class import method. now you can use method by itself, without the class name. RE: Not having to rewrite 'obj.' on each line - micseydel - Sep-30-2018 (Sep-30-2018, 01:14 AM)Larz60+ Wrote: you can also keep you class in a separate file, then if there's a method that you use a lot, import like: from class import method. now you can use method by itself, without the class name.That's a good idea. I believe that's how some stateful functions work in the random module. That said, you'd be limiting yourself to singletons (or plural-tons, but a fixed set of them). If that sufficed, I'd say it's an order of magnitude less terrible than what I posted. |