[Tutor] Initializing with a call like: someClass.open("someFile")?
Kent Johnson
kent37 at tds.net
Mon Feb 21 12:29:26 CET 2005
Christian Meesters wrote:
> Hi
>
> My cryptic subject is perhaps not sufficient - I'll try to make it a little better:
> Assume you'd like to write something like:
>
> import someClass
> x = someClass.open("someFile")
>
> Here '.open' should read in the data and initialize the instance - with or without calling __init__.
> How is this to implement? Up to now I rather wrote something like x =
> someClass(somePrepFunction("someFile")) where the return value of somePrepFunction was used
> to initialize x or called the conventional 'open' within __init__. But is there no direct approach like
> in my pseudo-code?
You can make your code work as written by making open() a module-level function in someClass.py.
Call the function fromFile() to avoid redefining open. Assuming the class has a constructor that
takes a string argument:
## someClass.py
def fromFile(f):
data = open(f).read()
return someClass(data)
class someClass:
def __init__(self, data ):
# init from data
Another way to do it, if this is the only way you create someClass instances, is to put the file
read right in __init__():
class someClass:
def __init__(self, f):
data = open(f).read()
# init from data
Finally, you can implement fromFile() as a classmethod of someClass:
class someClass:
def __init__(self, data ):
# init from data
@classmethod@ # requires Python 2.4
def fromFile(cls, f):
data = open(f).read()
return cls(data)
Clients would do this:
from someClass import someClass
x = someClass.fromFile("someFile")
See this thread on comp.lang.python for more discussion of a similar requirement:
http://tinyurl.com/497vg
Kent
> My problem is that if I simply define open as a method of someClass (with
> def open(self,file_name):
> #somecode
> pass
> ) all I get is:
> TypeError: unbound method open() must be called with someClass instance as first argument
> (got str instance instead)
> Which is perfectly understandable. But what is a possible workaround? (Instead of 'open' I could,
> of course, better use some other keyword which is no Python keyword.)
Several possibilities:
- you can make a function to do what you want:
>
> Any hints?
>
> Thanks a lot in advance.
> Christian
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list