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?
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?
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.
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.
(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.