Well its shouldn't be private because I expect that people (like us) will want to test if a field is a tag or not, and they would do that using this base class.

```python
isinstance(mesh.atag, Tag)     # True
isinstance(mesh.notatag, Tag)  # False
```

Now as per whether or not Tag should be an abstract base class or not I would argue not.  There are three primary reasons, I don't think so.

1. That is more work :)
2. The only thing it really buys you is that users can no longer instantiate the Tag class.  This same effect could be achieved by adding the following two lines to the `__init__()` method:

    ```python
    def __init__(self, ...):
        if self.__class__ is Tag:
            raise TypeError("Tags must be sub-classed to be created.")
    ```

3. Tags are a generic descriptors.  The methods that sub-classes aren't required by all conceivable Tags.  Thus Tags might have uses elsewhere.  For instance, if someone wanted a mesh-level tag they could just create a `Tag()` objects and assign an attribute to it.  All of our current Tag sub-classes are volume-level, but it doesn't always have to be this way.  I would rather not restrict ourselves from future APIs by making this an ABC.