f



Some problems with classes

Why/how is it possible to add variables like this? I don't understand
this mechanism:
http://docs.python.org/tut/node11.html#SECTION0011330000000000000000

class Employee:
    pass

john = Employee() # Create an empty employee record

# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000

---------------------------------------------------------------------------

Also, I can't get multiple inheritance to work.

Don't mind that the a vegan obviously don't inherit from an animal and
a vegetable. I didn't come up with anything better, it is just to
learn about inheritance.


class Animal(object):
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def speak(self):
        print "speak"

class Vegetable(object):
    def __init__(self, name, volume):
        self.name = name
        self.volume = volume

    def split(self):
        print "tjoff"

class Vegan(Animal, Vegetable):
    #pass
    def __init__(self, name, attacks):
        self.name = name
        self.attacks = attacks

>>>

Traceback (most recent call last):
  File "C:/Python25/Progs/XXXX/Movie.py", line 42, in <module>
    class ActionComedy(Movie, ActionMovie):
TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases Movie, ActionMovie
>>>


also, when inheriting, can I inherit __init__() somehow? If I want the
same attributes but perhaps some additional methods for example.

0
9/1/2008 1:39:14 AM
comp.lang.python 77058 articles. 6 followers. Post Follow

6 Replies
9419 Views

Similar Articles

[PageSpeed] 8

On Sun, Aug 31, 2008 at 6:39 PM, ssecorp <circularfunc@gmail.com> wrote:
> Why/how is it possible to add variables like this? I don't understand
> this mechanism:
> http://docs.python.org/tut/node11.html#SECTION0011330000000000000000

Under the covers, Python objects are implemented using dictionaries,
so adding an attribute just adds a new key-value pair to the object's
internal dictionary (which, incidentally, you can access as
someobj.__dict__).

>
> class Employee:
>    pass
>
> john = Employee() # Create an empty employee record
>
> # Fill the fields of the record
> john.name = 'John Doe'
> john.dept = 'computer lab'
> john.salary = 1000
>
> ---------------------------------------------------------------------------
>
> Also, I can't get multiple inheritance to work.
>
> Don't mind that the a vegan obviously don't inherit from an animal and
> a vegetable. I didn't come up with anything better, it is just to
> learn about inheritance.
>
>
> class Animal(object):
>    def __init__(self, name, weight):
>        self.name = name
>        self.weight = weight
>
>    def speak(self):
>        print "speak"
>
> class Vegetable(object):
>    def __init__(self, name, volume):
>        self.name = name
>        self.volume = volume
>
>    def split(self):
>        print "tjoff"
>
> class Vegan(Animal, Vegetable):
>    #pass
>    def __init__(self, name, attacks):
>        self.name = name
>        self.attacks = attacks
>
>>>>
>
> Traceback (most recent call last):
>  File "C:/Python25/Progs/XXXX/Movie.py", line 42, in <module>
>    class ActionComedy(Movie, ActionMovie):
> TypeError: Error when calling the metaclass bases
>    Cannot create a consistent method resolution
> order (MRO) for bases Movie, ActionMovie

The class names in error message here don't match the classes you
declared above. Give us the actual code you're using or at least a
stub version.

>>>>
>
>
> also, when inheriting, can I inherit __init__() somehow? If I want the
> same attributes but perhaps some additional methods for example.

Use super() to call your superclasses' __init__() methods. See
super()'s entry in http://docs.python.org/lib/built-in-funcs.html for
more info.

- Chris

>
> --
> http://mail.python.org/mailman/listinfo/python-list
>

-- 
Follow the path of the Iguana...
http://rebertia.com
0
clp4858 (217)
9/1/2008 1:50:24 AM
class Animal(object):
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def speak(self):
        print "speak"

class Vegetable(object):
    def __init__(self, name, volume):
        self.name = name
        self.volume = volume

    def split(self):
        print "tjoff"

class Vegan(Animal, Vegetable):
    def __init__(self, name, attacks):
        self.name = name
        self.attacks = attacks
0
9/1/2008 2:43:01 AM
also, how does super() work more exactly? I can't get it quite to
work.


class Movie(object):
    def __init__(self, movieId, grades, date):
        self.movieId = movieId
        self.grades = grades
        self.date = date

    def newGrade(self, grade):
        self.grades.append(grade)

    def spam(self):
        print "inherits all the way down?"

    def averageGrade(self):
         return sum(grade for grade in self.grades) / \
                len(self.grades)

class ActionMovie(Movie):
    super(Movie)
    ##def __init__(self, movieId, grades, date, kills):
    ##    self.movieId = movieId
    ##    self.grades = grades
    ##    self.date = date
    ##    self.kills = kills

    def newGrade(self, grade, date):
        self.grades.append(grade)
        self.date = date

    def prd(self):
        print self.date

class Comedy(ActionMovie):
    def __init__(self, movieId, grades, date):
        self.movieId = movieId
        self.grades = grades
        self.date = date

    def donk(self):
        print "im a donkey!"


subclasses has to be indented?
class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)
0
9/1/2008 2:54:39 AM
It works when I inherit from 2 classes but not when I inherit from 2
subclasses.


-----------------------------------------------------

from __future__ import division

class Movie(object):
    def __init__(self, movieId, grades, date):
        self.movieId = movieId
        self.grades = grades
        self.date = date

    def newGrade(self, grade):
        self.grades.append(grade)

    def spam(self):
        print "inherits all the way down?"

    def averageGrade(self):
         return sum(grade for grade in self.grades) / \
                len(self.grades)

class ActionMovie(Movie):
    #super(Movie, self)
    def __init__(self, movieId, grades, date, kills):
        self.movieId = movieId
        self.grades = grades
        self.date = date
        self.kills = kills

    def newGrade(self, grade, date):
        self.grades.append(grade)
        self.date = date

    def prd(self):
        print self.date

class Comedy(ActionMovie):
    def __init__(self, movieId, grades, date):
        self.movieId = movieId
        self.grades = grades
        self.date = date

    def donk(self):
        print "im a donkey!"

##class ActionComedy(Movie, ActionMovie):
##    def __init__(self, movieId, grades, date):
##        self.movieId = movieId
##        self.grades = grades
##        self.date = date



class Animal(object):
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

    def speak(self):
        print "speak"

class Vegetable(object):
    def __init__(self, name, volume):
        self.name = name
        self.volume = volume

    def split(self):
        print "tjoff"

class Vegan(Animal, Vegetable):
    #pass
    #super()
    def __init__(self, name, attacks):
        self.name = name
        self.attacks = attacks

0
9/1/2008 2:59:14 AM
On Sep 1, 3:39=A0am, ssecorp <circularf...@gmail.com> wrote:
>
> Traceback (most recent call last):
> =A0 File "C:/Python25/Progs/XXXX/Movie.py", line 42, in <module>
> =A0 =A0 class ActionComedy(Movie, ActionMovie):
> TypeError: Error when calling the metaclass bases
> =A0 =A0 Cannot create a consistent method resolution
> order (MRO) for bases Movie, ActionMovie

The MRO is explained here:
http://www.python.org/download/releases/2.3/mro/

Super is explained here:
http://www.artima.com/weblogs/index.jsp?blogger=3Dmicheles

Be warned that those are not readings for a beginner, but
if you want to use multiple inheritance and super you must
be prepared ;)
0
9/1/2008 3:12:27 AM
Chris Rebert a écrit :
> On Sun, Aug 31, 2008 at 6:39 PM, ssecorp <circularfunc@gmail.com> wrote:
>> Why/how is it possible to add variables like this? I don't understand
>> this mechanism:
>> http://docs.python.org/tut/node11.html#SECTION0011330000000000000000
> 
> Under the covers, Python objects are implemented using dictionaries,

Not necessarily.

> so adding an attribute just adds a new key-value pair to the object's
> internal dictionary (which, incidentally, you can access as
> someobj.__dict__).

Idem.
0
9/1/2008 4:18:57 PM
Reply: