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@python.org
http://mail.python.org/mailman/listinfo/tutor



_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to