Repository: ManimCommunity/manim

Issue:
VGroup and VDict must override __repr__ to display the mobjects contained
Consider this example:
```python
class Test(Scene):
    def construct(self):
        sq = Square()
        cir = Circle()
        grp = VGroup(sq, cir)
        print(grp) # --> Just prints: VGroup
        self.play(ShowCreation(grp))
        dct = VDict({'s' : sq, 'c' : cir}).next_to(grp, DOWN)
        print(dct) # --> Just prints: VDict
        self.play(ShowCreation(dct))
```
When there are _a lot_ of mobjects in the `VGroup` or `VDict`, it sometimes helps to know what are those mobjects while debugging.
Something like
`[Square, Circle]` or even better the full hash name (IDK what it's called) -- `manim.mobject....at 0x00...`.
Let me know how can this be best incorporated.


Discussion:
You have to define the `__str__` method of VGriup/VDict. I think some Mobjects already have a `__str__` method so it should be enough to do something like `return ", ".join(str(m) for m in self.mobjects)`
Seems to be an easy PR, if no one object 
Would like to know what would be preferred just `Square` or the full hash name? I can make a quick PR today if no one minds.
I would prefer implementing `__repr__` over `__str__` (see https://stackoverflow.com/questions/1436703/difference-between-str-and-repr), and would love to see more manim classes having proper `__repr__` methods. (Note in particular: if `__repr__` is defined and `__str__` is not, `str(object)` will still work.)

For the container, I fully agree that its repr should print a list of its children. But for something concrete like `Square` I would find it useful to let `Square(side_length=5)` print something like `'Square with side length 5'`, or even `'Square with side length 5 and center (0., 0., 0.)'`; the more explicit and defining the better. (For your PR it is fine to just take care of `VGroup` and `VDict`, improving their representation strings is definitely more important. 👍)
> Would like to know what would be preferred just `Square` or the full hash name? I can make a quick PR today if no one minds.

What hash ? 
> What hash ?

This
`<manim.mobject.geometry.Square object at 0x000001AA9A5E7790>`
I am not sure what's the proper name for this - I call this "printing the object"
I don't know the proper name either lol, but the hex thing at the end is the id, I think. 
And I think the id in the repr _can_ be sometimes useful, when one wants to check if two objects are different. 

Resolving patch:
diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py
--- a/manim/mobject/mobject.py
+++ b/manim/mobject/mobject.py
@@ -62,7 +62,7 @@ def __init__(self, **kwargs):
         self.generate_points()
         self.init_colors()
 
-    def __str__(self):
+    def __repr__(self):
         return str(self.name)
 
     def reset_points(self):
diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py
--- a/manim/mobject/types/vectorized_mobject.py
+++ b/manim/mobject/types/vectorized_mobject.py
@@ -876,6 +876,14 @@ def __init__(self, *vmobjects, **kwargs):
         VMobject.__init__(self, **kwargs)
         self.add(*vmobjects)
 
+    def __repr__(self):
+        return (
+            self.__class__.__name__
+            + "("
+            + ", ".join(str(mob) for mob in self.submobjects)
+            + ")"
+        )
+
     def add(self, *vmobjects):
         """Checks if all passed elements are an instance of VMobject and then add them to submobjects
 
@@ -934,6 +942,9 @@ def __init__(self, mapping_or_iterable={}, show_keys=False, **kwargs):
         self.submob_dict = {}
         self.add(mapping_or_iterable)
 
+    def __repr__(self):
+        return __class__.__name__ + "(" + repr(self.submob_dict) + ")"
+
     def add(self, mapping_or_iterable):
         """Adds the key-value pairs to the :class:`VDict` object.
 


Test patch: