On 04/03/2013 03:43 PM, frank ernest wrote:
Hi guys, it's been a while since I posted and I've learned a lot since then. 
Today I have a question on classes, I can't get mine to work.

Welcome back. I'll try. First comment is that indentation ought to be 4 columns, until you have enough experience to prefer something different. Certainly one column makes the code nearly illegible to me.

Second comment is that deriving from a built-in class like list is tricky. It won't be enough to define an __init__() method, and it turns out you're not using the inheritance anyway. So please get this working using only object as your base. You're probably using Python3.x, where object is implied, but it doesn't hurt to be specific.

class alist(object):

class alist(list):
  def __init__(self, b, a):
  self = list()

You forgot to indent the body of the method. That's an IndentationError during compile, so I suspect this code is NOT what you tried. I'll assume you indent the lines from here through the 'def appendit' line.

Please use copy/paste to put your code into your email message. If you retype it, you waste everybody's time.

Don't assign to 'self,' as once you do, you no longer have any access to the class instance. It's a parameter, automatically passed to your method. You probably want to add an attribute to hold the new list.

I'll assume you change it to:
    self.mylist = list()
    self.mylist.append(b)

  self.append(b)

  a = a + b
  def appendit(self):
  self.append(a)

You didn't indent again. Further, you referenced a, which was a parameter to an entirely different method. If you meant for it to be saved, you could have made it a new attribute in the first method, by using
    self.a = a

 
print(alist(2,4))

You never added anything to the list, so of course it prints out as empty. You created a new one inside your class.

[]
#It's blank!
c = alist(2,4)
c.appendit()
print(c)
[[...]]
#It's still blank!
If I add this:
  a = a + b
 
the last line of my deffinition I get:
c = alist(2,4)
c.appendit()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in appendit
UnboundLocalError: local variable 'a' referenced before assignment
If I make a nonlocal I get
SyntaxError: name 'a' is parameter and nonlocal
I want it to get my list and all the members in it when printing for instance. 
I also would like to without making them global create two variables which I 
can use throughout the whole class as their value will not change.


If you want a custom printing behavior, you'd need to define a __str__() method in your class. Since you don't, and since you inherit from list, you get its behavior.

I made the assumption throughout that it was a mistake to inherit from list. Most of my answers could have been different if you were really deliberate about inheriting from list. For example, you wouldn't be able to create your own list, but would have to use the one that you inherited from. You'd have to define a __new__() method, and call list's __new__() method from it. And if you created extra instances as your last sentence says, you'd have to define your own __str__() method, as the built in list logic wouldn't recognize anything you added.

In any case, I'd write a few successful plain classes before even beginning to do inheritance.

HTH

--
DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to