diff --git a/CHANGES.rst b/CHANGES.rst
index 9f9da33..d83b78b 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -66,6 +66,17 @@
   to the collections ABCs of the same name; ``Tuple`` now extends
   ``Sequence`` and ``List`` now extends ``MutableSequence``.
 
+- Add new field ``Collection``, implementing ``ICollection``. This is
+  the base class of ``Sequence``. Previously this was known as
+  ``AbstractCollection`` and was not public. It can be subclassed to
+  add ``value_type``, ``_type`` and ``unique`` attributes at the class
+  level, enabling a simpler constructor call. See `issue 23
+  <https://github.com/zopefoundation/zope.schema/issues/23>`_.
+
+- Make ``Object`` respect a ``schema`` attribute defined by a
+  subclass, enabling a simpler constructor call. See `issue 23
+  <https://github.com/zopefoundation/zope.schema/issues/23>`_.
+
 4.5.0 (2017-07-10)
 ==================
 
diff --git a/docs/api.rst b/docs/api.rst
index 35bd2be..a133111 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -139,6 +139,7 @@ Fields
 ======
 
 .. autoclass:: zope.schema.Field
+.. autoclass:: zope.schema.Collection
 .. autoclass:: zope.schema._field.AbstractCollection
 .. autoclass:: zope.schema.ASCII
    :no-show-inheritance:
diff --git a/src/zope/schema/__init__.py b/src/zope/schema/__init__.py
index 895459b..8fc6825 100644
--- a/src/zope/schema/__init__.py
+++ b/src/zope/schema/__init__.py
@@ -20,6 +20,7 @@ from zope.schema._field import Bool
 from zope.schema._field import Bytes
 from zope.schema._field import BytesLine
 from zope.schema._field import Choice
+from zope.schema._field import Collection
 from zope.schema._field import Container
 from zope.schema._field import Date
 from zope.schema._field import Datetime
@@ -75,6 +76,7 @@ __all__ = [
     'Bytes',
     'BytesLine',
     'Choice',
+    'Collection',
     'Container',
     'Date',
     'Datetime',
diff --git a/src/zope/schema/_bootstrapfields.py b/src/zope/schema/_bootstrapfields.py
index 6501310..6fee839 100644
--- a/src/zope/schema/_bootstrapfields.py
+++ b/src/zope/schema/_bootstrapfields.py
@@ -39,6 +39,15 @@ from zope.schema._compat import integer_types
 from zope.schema._schema import getFields
 
 
+class _NotGiven(object):
+
+    def __repr__(self): # pragma: no cover
+        return "<Not Given>"
+
+
+_NotGiven = _NotGiven()
+
+
 class ValidatedProperty(object):
 
     def __init__(self, name, check=None, allow_none=False):
@@ -97,7 +106,7 @@ class Field(Attribute):
     # Field constructor.  A marker is helpful since we don't want to
     # overwrite missing_value if it is set differently on a Field
     # subclass and isn't specified via the constructor.
-    __missing_value_marker = object()
+    __missing_value_marker = _NotGiven
 
     # Note that the "order" field has a dual existance:
     # 1. The class variable Field.order is used as a source for the
diff --git a/src/zope/schema/_field.py b/src/zope/schema/_field.py
index 9570ce8..d80ee3c 100644
--- a/src/zope/schema/_field.py
+++ b/src/zope/schema/_field.py
@@ -45,6 +45,7 @@ from zope.schema.interfaces import IBool
 from zope.schema.interfaces import IBytes
 from zope.schema.interfaces import IBytesLine
 from zope.schema.interfaces import IChoice
+from zope.schema.interfaces import ICollection
 from zope.schema.interfaces import IContextSourceBinder
 from zope.schema.interfaces import IDate
 from zope.schema.interfaces import IDatetime
@@ -99,6 +100,7 @@ from zope.schema._bootstrapfields import Bool
 from zope.schema._bootstrapfields import Int
 from zope.schema._bootstrapfields import Password
 from zope.schema._bootstrapfields import MinMaxLen
+from zope.schema._bootstrapfields import _NotGiven
 from zope.schema.fieldproperty import FieldProperty
 from zope.schema.vocabulary import getVocabularyRegistry
 from zope.schema.vocabulary import VocabularyRegistryError
@@ -133,6 +135,7 @@ classImplements(Bool, IFromUnicode)
 classImplements(Int, IInt)
 
 
+
 @implementer(ISourceText)
 class SourceText(Text):
     __doc__ = ISourceText.__doc__
@@ -538,21 +541,40 @@ def _validate_uniqueness(self, value):
         temp_values.append(item)
 
 
-class AbstractCollection(MinMaxLen, Iterable):
+@implementer(ICollection)
+class Collection(MinMaxLen, Iterable):
+    """
+    A generic collection implementing :class:`zope.schema.interfaces.ICollection`.
+
+    Subclasses can define the attribute ``value_type`` to be a field
+    such as an :class:`Object` that will be checked for each member of
+    the collection. This can then be omitted from the constructor call.
+
+    They can also define the attribute ``_type`` to be a concrete
+    class (or tuple of classes) that the collection itself will
+    be checked to be an instance of. This cannot be set in the constructor.
+
+    .. versionchanged:: 4.6.0
+       Add the ability for subclasses to specify ``value_type``
+       and ``unique``, and allow eliding them from the constructor.
+    """
     value_type = None
     unique = False
 
-    def __init__(self, value_type=None, unique=False, **kw):
-        super(AbstractCollection, self).__init__(**kw)
+    def __init__(self, value_type=_NotGiven, unique=_NotGiven, **kw):
+        super(Collection, self).__init__(**kw)
         # whine if value_type is not a field
-        if value_type is not None and not IField.providedBy(value_type):
+        if value_type is not _NotGiven:
+            self.value_type = value_type
+
+        if self.value_type is not None and not IField.providedBy(self.value_type):
             raise ValueError("'value_type' must be field instance.")
-        self.value_type = value_type
-        self.unique = unique
+        if unique is not _NotGiven:
+            self.unique = unique
 
     def bind(self, object):
         """See zope.schema._bootstrapinterfaces.IField."""
-        clone = super(AbstractCollection, self).bind(object)
+        clone = super(Collection, self).bind(object)
         # binding value_type is necessary for choices with named vocabularies,
         # and possibly also for other fields.
         if clone.value_type is not None:
@@ -560,7 +582,7 @@ class AbstractCollection(MinMaxLen, Iterable):
         return clone
 
     def _validate(self, value):
-        super(AbstractCollection, self)._validate(value)
+        super(Collection, self)._validate(value)
         errors = _validate_sequence(self.value_type, value)
         if errors:
             try:
@@ -572,8 +594,15 @@ class AbstractCollection(MinMaxLen, Iterable):
             _validate_uniqueness(self, value)
 
 
+#: An alternate name for :class:`.Collection`.
+#:
+#: .. deprecated:: 4.6.0
+#:   Use :class:`.Collection` instead.
+AbstractCollection = Collection
+
+
 @implementer(ISequence)
-class Sequence(AbstractCollection):
+class Sequence(Collection):
     """
     A field representing an ordered sequence.
 
@@ -604,28 +633,26 @@ class List(MutableSequence):
     _type = list
 
 
-@implementer(ISet)
-class Set(AbstractCollection):
-    """A field representing a set."""
-    _type = set
+class _AbstractSet(Collection):
+    unique = True
 
-    def __init__(self, **kw):
-        if 'unique' in kw:  # set members are always unique
+    def __init__(self, *args, **kwargs):
+        super(_AbstractSet, self).__init__(*args, **kwargs)
+        if not self.unique: # set members are always unique
             raise TypeError(
                 "__init__() got an unexpected keyword argument 'unique'")
-        super(Set, self).__init__(unique=True, **kw)
+
+
+@implementer(ISet)
+class Set(_AbstractSet):
+    """A field representing a set."""
+    _type = set
 
 
 @implementer(IFrozenSet)
-class FrozenSet(AbstractCollection):
+class FrozenSet(_AbstractSet):
     _type = frozenset
 
-    def __init__(self, **kw):
-        if 'unique' in kw:  # set members are always unique
-            raise TypeError(
-                "__init__() got an unexpected keyword argument 'unique'")
-        super(FrozenSet, self).__init__(unique=True, **kw)
-
 
 VALIDATED_VALUES = threading.local()
 
@@ -677,10 +704,11 @@ def _validate_fields(schema, value):
 @implementer(IObject)
 class Object(Field):
     __doc__ = IObject.__doc__
+    schema = None
 
-    def __init__(self, schema, **kw):
+    def __init__(self, schema=_NotGiven, **kw):
         """
-        Object(schema, *, validate_invariants=True, **kwargs)
+        Object(schema=<Not Given>, *, validate_invariants=True, **kwargs)
 
         Create an `~.IObject` field. The keyword arguments are as for `~.Field`.
 
@@ -688,7 +716,13 @@ class Object(Field):
            Add the keyword argument *validate_invariants*. When true (the default),
            the schema's ``validateInvariants`` method will be invoked to check
            the ``@invariant`` properties of the schema.
+        .. versionchanged:: 4.6.0
+           The *schema* argument can be ommitted in a subclass
+           that specifies a ``schema`` attribute.
         """
+        if schema is _NotGiven:
+            schema = self.schema
+
         if not IInterface.providedBy(schema):
             raise WrongType
 

"AbstractCollection" should allow to define "value_type" in a derived class
Currently, "AbstractCollection" looks like:

```
class AbstractCollection(MinMaxLen, Iterable)
    value_type = None
    unique = False

    def __init__(self, value_type=None, unique=False, **kw):
        super(AbstractCollection, self).__init__(**kw)
        # whine if value_type is not a field
        if value_type is not None and not IField.providedBy(value_type):
            raise ValueError("'value_type' must be field instance.")
        self.value_type = value_type
        self.unique = unique
```

This makes it difficult to define "value_type" in a derived class. I suggest to use a "marker" as default value for the "value_type" parameter of `AbstractCollection.__init__` and use the class default in this case.

diff --git a/src/zope/schema/tests/test__field.py b/src/zope/schema/tests/test__field.py
index dd9bd14..c035e85 100644
--- a/src/zope/schema/tests/test__field.py
+++ b/src/zope/schema/tests/test__field.py
@@ -1375,19 +1375,66 @@ class InterfaceFieldTests(unittest.TestCase):
         self.assertRaises(RequiredMissing, field.validate, None)
 
 
-class AbstractCollectionTests(unittest.TestCase):
+class CollectionTests(unittest.TestCase):
+
+    _DEFAULT_UNIQUE = False
 
     def _getTargetClass(self):
-        from zope.schema._field import AbstractCollection
-        return AbstractCollection
+        from zope.schema._field import Collection
+        return Collection
+
+    def _getTargetInterface(self):
+        from zope.schema.interfaces import ICollection
+        return ICollection
 
     def _makeOne(self, *args, **kw):
         return self._getTargetClass()(*args, **kw)
 
+    _makeCollection = list
+
+    def test_class_conforms_to_iface(self):
+        from zope.interface.verify import verifyClass
+        verifyClass(self._getTargetInterface(), self._getTargetClass())
+
+    def test_instance_conforms_to_iface(self):
+        from zope.interface.verify import verifyObject
+        verifyObject(self._getTargetInterface(), self._makeOne())
+
+
+    def test_schema_defined_by_subclass(self):
+        from zope import interface
+        from zope.schema import Object
+        from zope.schema.interfaces import WrongContainedType
+
+        class IValueType(interface.Interface):
+            "The value type schema"
+
+        the_value_type = Object(IValueType)
+
+        class Field(self._getTargetClass()):
+            value_type = the_value_type
+
+        field = Field()
+        self.assertIs(field.value_type, the_value_type)
+
+        # Empty collection is fine
+        field.validate(self._makeCollection([]))
+
+        # Collection with a non-implemented object is bad
+        self.assertRaises(WrongContainedType, field.validate, self._makeCollection([object()]))
+
+        # Actual implementation works
+        @interface.implementer(IValueType)
+        class ValueType(object):
+            "The value type"
+
+
+        field.validate(self._makeCollection([ValueType()]))
+
     def test_ctor_defaults(self):
         absc = self._makeOne()
         self.assertEqual(absc.value_type, None)
-        self.assertEqual(absc.unique, False)
+        self.assertEqual(absc.unique, self._DEFAULT_UNIQUE)
 
     def test_ctor_explicit(self):
         from zope.schema._bootstrapfields import Text
@@ -1407,7 +1454,7 @@ class AbstractCollectionTests(unittest.TestCase):
         bound = absc.bind(context)
         self.assertEqual(bound.context, context)
         self.assertEqual(bound.value_type, None)
-        self.assertEqual(bound.unique, False)
+        self.assertEqual(bound.unique, self._DEFAULT_UNIQUE)
 
     def test_bind_w_value_Type(self):
         from zope.schema._bootstrapfields import Text
@@ -1426,117 +1473,73 @@ class AbstractCollectionTests(unittest.TestCase):
         text = Text()
         absc = self._makeOne(text)
         with self.assertRaises(WrongContainedType) as exc:
-            absc.validate([1])
+            absc.validate(self._makeCollection([1]))
 
         wct = exc.exception
         self.assertIs(wct.field, absc)
-        self.assertEqual(wct.value, [1])
+        self.assertEqual(wct.value, self._makeCollection([1]))
 
     def test__validate_miss_uniqueness(self):
         from zope.schema.interfaces import NotUnique
+        from zope.schema.interfaces import WrongType
         from zope.schema._bootstrapfields import Text
 
         text = Text()
         absc = self._makeOne(text, True)
-        with self.assertRaises(NotUnique) as exc:
+        with self.assertRaises((NotUnique, WrongType)) as exc:
             absc.validate([u'a', u'a'])
 
         not_uniq = exc.exception
         self.assertIs(not_uniq.field, absc)
-        self.assertEqual(not_uniq.value, [u'a', u'a'])
-
-
-class TupleTests(unittest.TestCase):
-
-    def _getTargetClass(self):
-        from zope.schema._field import Tuple
-        return Tuple
-
-    def _makeOne(self, *args, **kw):
-        return self._getTargetClass()(*args, **kw)
-
-    def test_class_conforms_to_ITuple(self):
-        from zope.interface.verify import verifyClass
-        from zope.schema.interfaces import ITuple
-        verifyClass(ITuple, self._getTargetClass())
-
-    def test_instance_conforms_to_ITuple(self):
-        from zope.interface.verify import verifyObject
-        from zope.schema.interfaces import ITuple
-        verifyObject(ITuple, self._makeOne())
-
-    def test_validate_wrong_types(self):
-        from zope.schema.interfaces import WrongType
-
-
-        field = self._makeOne()
-        self.assertRaises(WrongType, field.validate, u'')
-        self.assertRaises(WrongType, field.validate, b'')
-        self.assertRaises(WrongType, field.validate, 1)
-        self.assertRaises(WrongType, field.validate, 1.0)
-        self.assertRaises(WrongType, field.validate, [])
-        self.assertRaises(WrongType, field.validate, {})
-        self.assertRaises(WrongType, field.validate, set())
-        self.assertRaises(WrongType, field.validate, frozenset())
-        self.assertRaises(WrongType, field.validate, object())
-
-    def test_validate_not_required(self):
-        field = self._makeOne(required=False)
-        field.validate(())
-        field.validate((1, 2))
-        field.validate((3,))
-        field.validate(None)
-
-    def test_validate_required(self):
-        from zope.schema.interfaces import RequiredMissing
-        field = self._makeOne()
-        field.validate(())
-        field.validate((1, 2))
-        field.validate((3,))
-        with self.assertRaises(RequiredMissing) as exc:
-            field.validate(None)
-
-        req_missing = exc.exception
-        self.assertIs(req_missing.field, field)
-        self.assertEqual(req_missing.value, None)
+        self.assertEqual(not_uniq.value,
+                         [u'a', u'a'])
 
     def test_validate_min_length(self):
         from zope.schema.interfaces import TooShort
         field = self._makeOne(min_length=2)
-        field.validate((1, 2))
-        field.validate((1, 2, 3))
-        self.assertRaises(TooShort, field.validate, ())
-        with self.assertRaises(TooShort) as exc:
-            field.validate((1,))
-
-        too_short = exc.exception
-        self.assertIs(too_short.field, field)
-        self.assertEqual(too_short.value, (1,))
+        field.validate(self._makeCollection((1, 2)))
+        field.validate(self._makeCollection((1, 2, 3)))
+        self.assertRaises(TooShort, field.validate, self._makeCollection())
+        self.assertRaises(TooShort, field.validate, self._makeCollection((1,)))
 
     def test_validate_max_length(self):
         from zope.schema.interfaces import TooLong
         field = self._makeOne(max_length=2)
-        field.validate(())
-        field.validate((1, 2))
-        self.assertRaises(TooLong, field.validate, (1, 2, 3, 4))
-        with self.assertRaises(TooLong) as exc:
-            field.validate((1, 2, 3))
-
-        too_long = exc.exception
-        self.assertIs(too_long.field, field)
-        self.assertEqual(too_long.value, (1, 2, 3))
+        field.validate(self._makeCollection())
+        field.validate(self._makeCollection((1,)))
+        field.validate(self._makeCollection((1, 2)))
+        self.assertRaises(TooLong, field.validate, self._makeCollection((1, 2, 3, 4)))
+        self.assertRaises(TooLong, field.validate, self._makeCollection((1, 2, 3)))
 
     def test_validate_min_length_and_max_length(self):
         from zope.schema.interfaces import TooLong
         from zope.schema.interfaces import TooShort
         field = self._makeOne(min_length=1, max_length=2)
-        field.validate((1, ))
-        field.validate((1, 2))
-        self.assertRaises(TooShort, field.validate, ())
-        self.assertRaises(TooLong, field.validate, (1, 2, 3))
+        field.validate(self._makeCollection((1,)))
+        field.validate(self._makeCollection((1, 2)))
+        self.assertRaises(TooShort, field.validate, self._makeCollection())
+        self.assertRaises(TooLong, field.validate, self._makeCollection((1, 2, 3)))
+
+    def test_validate_not_required(self):
+        field = self._makeOne(required=False)
+        field.validate(self._makeCollection())
+        field.validate(self._makeCollection((1, 2)))
+        field.validate(self._makeCollection((3,)))
+        field.validate(None)
 
+    def test_validate_required(self):
+        from zope.schema.interfaces import RequiredMissing
+        field = self._makeOne()
+        field.validate(self._makeCollection())
+        field.validate(self._makeCollection((1, 2)))
+        field.validate(self._makeCollection((3,)))
+        field.validate(self._makeCollection())
+        field.validate(self._makeCollection((1, 2)))
+        field.validate(self._makeCollection((3,)))
+        self.assertRaises(RequiredMissing, field.validate, None)
 
-class SequenceTests(unittest.TestCase):
+
+class SequenceTests(CollectionTests):
 
     def _getTargetClass(self):
         from zope.schema._field import Sequence
@@ -1546,17 +1549,6 @@ class SequenceTests(unittest.TestCase):
         from zope.schema.interfaces import ISequence
         return ISequence
 
-    def _makeOne(self, *args, **kw):
-        return self._getTargetClass()(*args, **kw)
-
-    def test_class_conforms_to_iface(self):
-        from zope.interface.verify import verifyClass
-        verifyClass(self._getTargetInterface(), self._getTargetClass())
-
-    def test_instance_conforms_to_IList(self):
-        from zope.interface.verify import verifyObject
-        verifyObject(self._getTargetInterface(), self._makeOne())
-
     def test_validate_wrong_types(self):
         from zope.schema.interfaces import WrongType
 
@@ -1568,47 +1560,6 @@ class SequenceTests(unittest.TestCase):
         self.assertRaises(WrongType, field.validate, frozenset())
         self.assertRaises(WrongType, field.validate, object())
 
-    def test_validate_not_required(self):
-        field = self._makeOne(required=False)
-        field.validate([])
-        field.validate([1, 2])
-        field.validate([3])
-        field.validate(None)
-
-    def test_validate_required(self):
-        from zope.schema.interfaces import RequiredMissing
-        field = self._makeOne()
-        field.validate([])
-        field.validate([1, 2])
-        field.validate([3])
-        self.assertRaises(RequiredMissing, field.validate, None)
-
-    def test_validate_min_length(self):
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=2)
-        field.validate([1, 2])
-        field.validate([1, 2, 3])
-        self.assertRaises(TooShort, field.validate, [])
-        self.assertRaises(TooShort, field.validate, [1, ])
-
-    def test_validate_max_length(self):
-        from zope.schema.interfaces import TooLong
-        field = self._makeOne(max_length=2)
-        field.validate([])
-        field.validate([1])
-        field.validate([1, 2])
-        self.assertRaises(TooLong, field.validate, [1, 2, 3, 4])
-        self.assertRaises(TooLong, field.validate, [1, 2, 3])
-
-    def test_validate_min_length_and_max_length(self):
-        from zope.schema.interfaces import TooLong
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=1, max_length=2)
-        field.validate([1])
-        field.validate([1, 2])
-        self.assertRaises(TooShort, field.validate, [])
-        self.assertRaises(TooLong, field.validate, [1, 2, 3])
-
     def test_sequence(self):
         from zope.schema._field import abc
 
@@ -1643,6 +1594,38 @@ class SequenceTests(unittest.TestCase):
         field = self._makeOne()
         field.validate(sequence)
 
+
+class TupleTests(SequenceTests):
+
+    _makeCollection = tuple
+
+    def _getTargetClass(self):
+        from zope.schema._field import Tuple
+        return Tuple
+
+    def _getTargetInterface(self):
+        from zope.schema.interfaces import ITuple
+        return ITuple
+
+    def test_mutable_sequence(self):
+        from zope.schema.interfaces import WrongType
+        with self.assertRaises(WrongType):
+            super(TupleTests, self).test_mutable_sequence()
+
+    def test_sequence(self):
+        from zope.schema.interfaces import WrongType
+        with self.assertRaises(WrongType):
+            super(TupleTests, self).test_sequence()
+
+    def test_validate_wrong_types(self):
+        from zope.schema.interfaces import WrongType
+        field = self._makeOne()
+        self.assertRaises(WrongType, field.validate, u'')
+        self.assertRaises(WrongType, field.validate, b'')
+        self.assertRaises(WrongType, field.validate, [])
+        super(TupleTests, self).test_validate_wrong_types()
+
+
 class MutableSequenceTests(SequenceTests):
 
     def _getTargetClass(self):
@@ -1659,7 +1642,6 @@ class MutableSequenceTests(SequenceTests):
         self.assertRaises(WrongType, field.validate, u'')
         self.assertRaises(WrongType, field.validate, b'')
         self.assertRaises(WrongType, field.validate, ())
-
         super(MutableSequenceTests, self).test_validate_wrong_types()
 
     def test_sequence(self):
@@ -1684,34 +1666,28 @@ class ListTests(MutableSequenceTests):
             super(ListTests, self).test_mutable_sequence()
 
 
-class SetTests(unittest.TestCase):
+class SetTests(CollectionTests):
+
+    _DEFAULT_UNIQUE = True
+    _makeCollection = set
+    _makeWrongSet = frozenset
 
     def _getTargetClass(self):
         from zope.schema._field import Set
         return Set
 
-    def _makeOne(self, *args, **kw):
-        return self._getTargetClass()(*args, **kw)
-
-    def test_class_conforms_to_ISet(self):
-        from zope.interface.verify import verifyClass
-        from zope.schema.interfaces import ISet
-        verifyClass(ISet, self._getTargetClass())
-
-    def test_instance_conforms_to_ISet(self):
-        from zope.interface.verify import verifyObject
+    def _getTargetInterface(self):
         from zope.schema.interfaces import ISet
-        verifyObject(ISet, self._makeOne())
+        return ISet
 
     def test_ctor_disallows_unique(self):
         self.assertRaises(TypeError, self._makeOne, unique=False)
-        self.assertRaises(TypeError, self._makeOne, unique=True)
+        self._makeOne(unique=True) # restating the obvious is allowed
         self.assertTrue(self._makeOne().unique)
 
     def test_validate_wrong_types(self):
         from zope.schema.interfaces import WrongType
 
-
         field = self._makeOne()
         self.assertRaises(WrongType, field.validate, u'')
         self.assertRaises(WrongType, field.validate, b'')
@@ -1720,133 +1696,22 @@ class SetTests(unittest.TestCase):
         self.assertRaises(WrongType, field.validate, ())
         self.assertRaises(WrongType, field.validate, [])
         self.assertRaises(WrongType, field.validate, {})
-        self.assertRaises(WrongType, field.validate, frozenset())
+        self.assertRaises(WrongType, field.validate, self._makeWrongSet())
         self.assertRaises(WrongType, field.validate, object())
 
-    def test_validate_not_required(self):
-        field = self._makeOne(required=False)
-        field.validate(set())
-        field.validate(set((1, 2)))
-        field.validate(set((3,)))
-        field.validate(None)
-
-    def test_validate_required(self):
-        from zope.schema.interfaces import RequiredMissing
-        field = self._makeOne()
-        field.validate(set())
-        field.validate(set((1, 2)))
-        field.validate(set((3,)))
-        field.validate(set())
-        field.validate(set((1, 2)))
-        field.validate(set((3,)))
-        self.assertRaises(RequiredMissing, field.validate, None)
-
-    def test_validate_min_length(self):
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=2)
-        field.validate(set((1, 2)))
-        field.validate(set((1, 2, 3)))
-        self.assertRaises(TooShort, field.validate, set())
-        self.assertRaises(TooShort, field.validate, set((1,)))
-
-    def test_validate_max_length(self):
-        from zope.schema.interfaces import TooLong
-        field = self._makeOne(max_length=2)
-        field.validate(set())
-        field.validate(set((1,)))
-        field.validate(set((1, 2)))
-        self.assertRaises(TooLong, field.validate, set((1, 2, 3, 4)))
-        self.assertRaises(TooLong, field.validate, set((1, 2, 3)))
 
-    def test_validate_min_length_and_max_length(self):
-        from zope.schema.interfaces import TooLong
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=1, max_length=2)
-        field.validate(set((1,)))
-        field.validate(set((1, 2)))
-        self.assertRaises(TooShort, field.validate, set())
-        self.assertRaises(TooLong, field.validate, set((1, 2, 3)))
+class FrozenSetTests(SetTests):
 
-
-class FrozenSetTests(unittest.TestCase):
+    _makeCollection = frozenset
+    _makeWrongSet = set
 
     def _getTargetClass(self):
         from zope.schema._field import FrozenSet
         return FrozenSet
 
-    def _makeOne(self, *args, **kw):
-        return self._getTargetClass()(*args, **kw)
-
-    def test_class_conforms_to_IFrozenSet(self):
-        from zope.interface.verify import verifyClass
-        from zope.schema.interfaces import IFrozenSet
-        verifyClass(IFrozenSet, self._getTargetClass())
-
-    def test_instance_conforms_to_IFrozenSet(self):
-        from zope.interface.verify import verifyObject
+    def _getTargetInterface(self):
         from zope.schema.interfaces import IFrozenSet
-        verifyObject(IFrozenSet, self._makeOne())
-
-    def test_ctor_disallows_unique(self):
-        self.assertRaises(TypeError, self._makeOne, unique=False)
-        self.assertRaises(TypeError, self._makeOne, unique=True)
-        self.assertTrue(self._makeOne().unique)
-
-    def test_validate_wrong_types(self):
-        from zope.schema.interfaces import WrongType
-
-
-        field = self._makeOne()
-        self.assertRaises(WrongType, field.validate, u'')
-        self.assertRaises(WrongType, field.validate, b'')
-        self.assertRaises(WrongType, field.validate, 1)
-        self.assertRaises(WrongType, field.validate, 1.0)
-        self.assertRaises(WrongType, field.validate, ())
-        self.assertRaises(WrongType, field.validate, [])
-        self.assertRaises(WrongType, field.validate, {})
-        self.assertRaises(WrongType, field.validate, set())
-        self.assertRaises(WrongType, field.validate, object())
-
-    def test_validate_not_required(self):
-        field = self._makeOne(required=False)
-        field.validate(frozenset())
-        field.validate(frozenset((1, 2)))
-        field.validate(frozenset((3,)))
-        field.validate(None)
-
-    def test_validate_required(self):
-        from zope.schema.interfaces import RequiredMissing
-        field = self._makeOne()
-        field.validate(frozenset())
-        field.validate(frozenset((1, 2)))
-        field.validate(frozenset((3,)))
-        self.assertRaises(RequiredMissing, field.validate, None)
-
-    def test_validate_min_length(self):
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=2)
-        field.validate(frozenset((1, 2)))
-        field.validate(frozenset((1, 2, 3)))
-        self.assertRaises(TooShort, field.validate, frozenset())
-        self.assertRaises(TooShort, field.validate, frozenset((1,)))
-
-    def test_validate_max_length(self):
-        from zope.schema.interfaces import TooLong
-        field = self._makeOne(max_length=2)
-        field.validate(frozenset())
-        field.validate(frozenset((1,)))
-        field.validate(frozenset((1, 2)))
-        self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3, 4)))
-        self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3)))
-
-    def test_validate_min_length_and_max_length(self):
-        from zope.schema.interfaces import TooLong
-        from zope.schema.interfaces import TooShort
-        field = self._makeOne(min_length=1, max_length=2)
-        field.validate(frozenset((1,)))
-        field.validate(frozenset((1, 2)))
-        self.assertRaises(TooShort, field.validate, frozenset())
-        self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3)))
+        return IFrozenSet
 
 
 class ObjectTests(unittest.TestCase):
@@ -2191,13 +2056,13 @@ class ObjectTests(unittest.TestCase):
             bar = Bytes()
 
             @invariant
-            def check_foo(o):
-                if o.foo == u'bar':
+            def check_foo(self):
+                if self.foo == u'bar':
                     raise Invalid("Foo is not valid")
 
             @invariant
-            def check_bar(o):
-                if o.bar == b'foo':
+            def check_bar(self):
+                if self.bar == b'foo':
                     raise Invalid("Bar is not valid")
 
         @implementer(ISchema)
@@ -2235,6 +2100,30 @@ class ObjectTests(unittest.TestCase):
         field = self._makeOne(ISchema, validate_invariants=False)
         field.validate(inst)
 
+    def test_schema_defined_by_subclass(self):
+        from zope import interface
+        from zope.schema.interfaces import SchemaNotProvided
+
+        class IValueType(interface.Interface):
+            "The value type schema"
+
+        class Field(self._getTargetClass()):
+            schema = IValueType
+
+        field = Field()
+        self.assertIs(field.schema, IValueType)
+
+        # Non implementation is bad
+        self.assertRaises(SchemaNotProvided, field.validate, object())
+
+        # Actual implementation works
+        @interface.implementer(IValueType)
+        class ValueType(object):
+            "The value type"
+
+
+        field.validate(ValueType())
+
 
 class MappingTests(unittest.TestCase):
 
@@ -2452,6 +2341,7 @@ def _makeDummyRegistry(v):
 
     class DummyRegistry(VocabularyRegistry):
         def __init__(self, vocabulary):
+            VocabularyRegistry.__init__(self)
             self._vocabulary = vocabulary
 
         def get(self, object, name):

pip install -e .[test]
parse_log_pytest
requirements.txt
pytest
3.6
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
iniconfig==1.1.1
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0
zope.event==4.6
zope.exceptions==4.6
zope.interface==5.5.2
-e git+https://github.com/zopefoundation/zope.schema.git@19c95112eea707be0e40166c59f0702a280a14f0#egg=zope.schema
zope.testing==5.0.1
zope.testrunner==5.6

name: zope.schema
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
      - zope-event==4.6
      - zope-exceptions==4.6
      - zope-interface==5.5.2
      - zope-testing==5.0.1
      - zope-testrunner==5.6
prefix: /opt/conda/envs/zope.schema

src/zope/schema/tests/test__field.py::CollectionTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::CollectionTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::CollectionTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::CollectionTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::CollectionTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::CollectionTests::test_ctor_defaults src/zope/schema/tests/test__field.py::CollectionTests::test_ctor_explicit src/zope/schema/tests/test__field.py::CollectionTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::CollectionTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::CollectionTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::CollectionTests::test_validate_max_length src/zope/schema/tests/test__field.py::CollectionTests::test_validate_min_length src/zope/schema/tests/test__field.py::CollectionTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::CollectionTests::test_validate_not_required src/zope/schema/tests/test__field.py::CollectionTests::test_validate_required src/zope/schema/tests/test__field.py::SequenceTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::TupleTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::MutableSequenceTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::ListTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::SetTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::SetTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::SetTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::SetTests::test_ctor_disallows_unique src/zope/schema/tests/test__field.py::SetTests::test_ctor_explicit src/zope/schema/tests/test__field.py::SetTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::SetTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::FrozenSetTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::FrozenSetTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::FrozenSetTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::FrozenSetTests::test_ctor_disallows_unique src/zope/schema/tests/test__field.py::FrozenSetTests::test_ctor_explicit src/zope/schema/tests/test__field.py::FrozenSetTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::FrozenSetTests::test_schema_defined_by_subclass src/zope/schema/tests/test__field.py::ObjectTests::test_schema_defined_by_subclass
src/zope/schema/tests/test__field.py::BytesTests::test_class_conforms_to_IBytes src/zope/schema/tests/test__field.py::BytesTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::BytesTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::BytesTests::test_instance_conforms_to_IBytes src/zope/schema/tests/test__field.py::BytesTests::test_validate_not_required src/zope/schema/tests/test__field.py::BytesTests::test_validate_required src/zope/schema/tests/test__field.py::BytesTests::test_validate_w_invalid_default src/zope/schema/tests/test__field.py::BytesTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ASCIITests::test__validate_empty src/zope/schema/tests/test__field.py::ASCIITests::test__validate_non_empty_hit src/zope/schema/tests/test__field.py::ASCIITests::test__validate_non_empty_miss src/zope/schema/tests/test__field.py::ASCIITests::test_class_conforms_to_IASCII src/zope/schema/tests/test__field.py::ASCIITests::test_instance_conforms_to_IASCII src/zope/schema/tests/test__field.py::ASCIITests::test_validate_wrong_types src/zope/schema/tests/test__field.py::BytesLineTests::test_class_conforms_to_IBytesLine src/zope/schema/tests/test__field.py::BytesLineTests::test_constraint src/zope/schema/tests/test__field.py::BytesLineTests::test_instance_conforms_to_IBytesLine src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_not_required src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_required src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ASCIILineTests::test_class_conforms_to_IASCIILine src/zope/schema/tests/test__field.py::ASCIILineTests::test_constraint src/zope/schema/tests/test__field.py::ASCIILineTests::test_instance_conforms_to_IASCIILine src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_not_required src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_required src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::FloatTests::test_class_conforms_to_IFloat src/zope/schema/tests/test__field.py::FloatTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::FloatTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::FloatTests::test_instance_conforms_to_IFloat src/zope/schema/tests/test__field.py::FloatTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_min src/zope/schema/tests/test__field.py::FloatTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_not_required src/zope/schema/tests/test__field.py::FloatTests::test_validate_required src/zope/schema/tests/test__field.py::DecimalTests::test_class_conforms_to_IDecimal src/zope/schema/tests/test__field.py::DecimalTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::DecimalTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::DecimalTests::test_instance_conforms_to_IDecimal src/zope/schema/tests/test__field.py::DecimalTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DecimalTests::test_validate_max src/zope/schema/tests/test__field.py::DecimalTests::test_validate_min src/zope/schema/tests/test__field.py::DecimalTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::DecimalTests::test_validate_not_required src/zope/schema/tests/test__field.py::DecimalTests::test_validate_required src/zope/schema/tests/test__field.py::DatetimeTests::test_class_conforms_to_IDatetime src/zope/schema/tests/test__field.py::DatetimeTests::test_instance_conforms_to_IDatetime src/zope/schema/tests/test__field.py::DatetimeTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_not_required src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_required src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_min src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_min_and_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::DateTests::test_class_conforms_to_IDate src/zope/schema/tests/test__field.py::DateTests::test_instance_conforms_to_IDate src/zope/schema/tests/test__field.py::DateTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DateTests::test_validate_not_required src/zope/schema/tests/test__field.py::DateTests::test_validate_required src/zope/schema/tests/test__field.py::DateTests::test_validate_w_max src/zope/schema/tests/test__field.py::DateTests::test_validate_w_min src/zope/schema/tests/test__field.py::DateTests::test_validate_w_min_and_max src/zope/schema/tests/test__field.py::DateTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::TimedeltaTests::test_class_conforms_to_ITimedelta src/zope/schema/tests/test__field.py::TimedeltaTests::test_instance_conforms_to_ITimedelta src/zope/schema/tests/test__field.py::TimedeltaTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_min src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_not_required src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_required src/zope/schema/tests/test__field.py::TimeTests::test_class_conforms_to_ITime src/zope/schema/tests/test__field.py::TimeTests::test_instance_conforms_to_ITime src/zope/schema/tests/test__field.py::TimeTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_min src/zope/schema/tests/test__field.py::TimeTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_not_required src/zope/schema/tests/test__field.py::TimeTests::test_validate_required src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_int src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_mixed src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_source_is_ICSB_bound src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_source_is_ICSB_unbound src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_string src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_tuple src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_w_named_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_w_named_vocabulary_invalid src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_preconstructed_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_is_ICSB src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_is_ICSB_but_not_ISource src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_not_ICSB src/zope/schema/tests/test__field.py::ChoiceTests::test_class_conforms_to_IChoice src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_both_vocabulary_and_source src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_both_vocabulary_and_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_invalid_source src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_invalid_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_named_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_preconstructed_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_unicode_non_ascii_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_wo_values_vocabulary_or_source src/zope/schema/tests/test__field.py::ChoiceTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::ChoiceTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::ChoiceTests::test_instance_conforms_to_IChoice src/zope/schema/tests/test__field.py::URITests::test_class_conforms_to_IURI src/zope/schema/tests/test__field.py::URITests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::URITests::test_fromUnicode_ok src/zope/schema/tests/test__field.py::URITests::test_instance_conforms_to_IURI src/zope/schema/tests/test__field.py::URITests::test_validate_not_a_uri src/zope/schema/tests/test__field.py::URITests::test_validate_not_required src/zope/schema/tests/test__field.py::URITests::test_validate_required src/zope/schema/tests/test__field.py::URITests::test_validate_wrong_types src/zope/schema/tests/test__field.py::DottedNameTests::test_class_conforms_to_IDottedName src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_defaults src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_max_dots_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_max_dots_valid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_min_dots_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_min_dots_valid src/zope/schema/tests/test__field.py::DottedNameTests::test_fromUnicode_dotted_name_ok src/zope/schema/tests/test__field.py::DottedNameTests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_instance_conforms_to_IDottedName src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_not_a_dotted_name src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_not_required src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_required src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_w_max_dots src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_w_min_dots src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::IdTests::test_class_conforms_to_IId src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_dotted_name_ok src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_url_ok src/zope/schema/tests/test__field.py::IdTests::test_instance_conforms_to_IId src/zope/schema/tests/test__field.py::IdTests::test_validate_not_a_uri src/zope/schema/tests/test__field.py::IdTests::test_validate_not_required src/zope/schema/tests/test__field.py::IdTests::test_validate_required src/zope/schema/tests/test__field.py::IdTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_class_conforms_to_IInterfaceField src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_instance_conforms_to_IInterfaceField src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_not_required src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_required src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::SequenceTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::SequenceTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::SequenceTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::SequenceTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::SequenceTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::SequenceTests::test_ctor_defaults src/zope/schema/tests/test__field.py::SequenceTests::test_ctor_explicit src/zope/schema/tests/test__field.py::SequenceTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::SequenceTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::SequenceTests::test_mutable_sequence src/zope/schema/tests/test__field.py::SequenceTests::test_sequence src/zope/schema/tests/test__field.py::SequenceTests::test_validate_max_length src/zope/schema/tests/test__field.py::SequenceTests::test_validate_min_length src/zope/schema/tests/test__field.py::SequenceTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::SequenceTests::test_validate_not_required src/zope/schema/tests/test__field.py::SequenceTests::test_validate_required src/zope/schema/tests/test__field.py::SequenceTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::TupleTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::TupleTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::TupleTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::TupleTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::TupleTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::TupleTests::test_ctor_defaults src/zope/schema/tests/test__field.py::TupleTests::test_ctor_explicit src/zope/schema/tests/test__field.py::TupleTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::TupleTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::TupleTests::test_mutable_sequence src/zope/schema/tests/test__field.py::TupleTests::test_sequence src/zope/schema/tests/test__field.py::TupleTests::test_validate_max_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_min_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_not_required src/zope/schema/tests/test__field.py::TupleTests::test_validate_required src/zope/schema/tests/test__field.py::TupleTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::MutableSequenceTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::MutableSequenceTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::MutableSequenceTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::MutableSequenceTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::MutableSequenceTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::MutableSequenceTests::test_ctor_defaults src/zope/schema/tests/test__field.py::MutableSequenceTests::test_ctor_explicit src/zope/schema/tests/test__field.py::MutableSequenceTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::MutableSequenceTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::MutableSequenceTests::test_mutable_sequence src/zope/schema/tests/test__field.py::MutableSequenceTests::test_sequence src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_max_length src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_min_length src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_not_required src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_required src/zope/schema/tests/test__field.py::MutableSequenceTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ListTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::ListTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::ListTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::ListTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::ListTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::ListTests::test_ctor_defaults src/zope/schema/tests/test__field.py::ListTests::test_ctor_explicit src/zope/schema/tests/test__field.py::ListTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::ListTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::ListTests::test_mutable_sequence src/zope/schema/tests/test__field.py::ListTests::test_sequence src/zope/schema/tests/test__field.py::ListTests::test_validate_max_length src/zope/schema/tests/test__field.py::ListTests::test_validate_min_length src/zope/schema/tests/test__field.py::ListTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::ListTests::test_validate_not_required src/zope/schema/tests/test__field.py::ListTests::test_validate_required src/zope/schema/tests/test__field.py::ListTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::SetTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::SetTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::SetTests::test_ctor_defaults src/zope/schema/tests/test__field.py::SetTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::SetTests::test_validate_max_length src/zope/schema/tests/test__field.py::SetTests::test_validate_min_length src/zope/schema/tests/test__field.py::SetTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::SetTests::test_validate_not_required src/zope/schema/tests/test__field.py::SetTests::test_validate_required src/zope/schema/tests/test__field.py::SetTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::FrozenSetTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::FrozenSetTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::FrozenSetTests::test_ctor_defaults src/zope/schema/tests/test__field.py::FrozenSetTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_max_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_min_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_not_required src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_required src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_empty_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_not_providing_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema_but_invalid_fields src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema_but_missing_fields src/zope/schema/tests/test__field.py::ObjectTests::test_class_conforms_to_IObject src/zope/schema/tests/test__field.py::ObjectTests::test_ctor_w_bad_schema src/zope/schema/tests/test__field.py::ObjectTests::test_instance_conforms_to_IObject src/zope/schema/tests/test__field.py::ObjectTests::test_set_allows_IBOAE_subscr_to_replace_value src/zope/schema/tests/test__field.py::ObjectTests::test_set_emits_IBOAE src/zope/schema/tests/test__field.py::ObjectTests::test_validate_not_required src/zope/schema/tests/test__field.py::ObjectTests::test_validate_required src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles_collection_not_valid src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles_object_not_valid src/zope/schema/tests/test__field.py::ObjectTests::test_validates_invariants_by_default src/zope/schema/tests/test__field.py::MappingTests::test_bind_binds_key_and_value_types src/zope/schema/tests/test__field.py::MappingTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::MappingTests::test_ctor_key_type_not_IField src/zope/schema/tests/test__field.py::MappingTests::test_ctor_value_type_not_IField src/zope/schema/tests/test__field.py::MappingTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::MappingTests::test_mapping src/zope/schema/tests/test__field.py::MappingTests::test_mutable_mapping src/zope/schema/tests/test__field.py::MappingTests::test_validate_invalid_key_type src/zope/schema/tests/test__field.py::MappingTests::test_validate_invalid_value_type src/zope/schema/tests/test__field.py::MappingTests::test_validate_max_length src/zope/schema/tests/test__field.py::MappingTests::test_validate_min_length src/zope/schema/tests/test__field.py::MappingTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::MappingTests::test_validate_not_required src/zope/schema/tests/test__field.py::MappingTests::test_validate_required src/zope/schema/tests/test__field.py::MappingTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::MutableMappingTests::test_bind_binds_key_and_value_types src/zope/schema/tests/test__field.py::MutableMappingTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::MutableMappingTests::test_ctor_key_type_not_IField src/zope/schema/tests/test__field.py::MutableMappingTests::test_ctor_value_type_not_IField src/zope/schema/tests/test__field.py::MutableMappingTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::MutableMappingTests::test_mapping src/zope/schema/tests/test__field.py::MutableMappingTests::test_mutable_mapping src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_invalid_key_type src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_invalid_value_type src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_max_length src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_min_length src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_not_required src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_required src/zope/schema/tests/test__field.py::MutableMappingTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::DictTests::test_bind_binds_key_and_value_types src/zope/schema/tests/test__field.py::DictTests::test_class_conforms_to_iface src/zope/schema/tests/test__field.py::DictTests::test_ctor_key_type_not_IField src/zope/schema/tests/test__field.py::DictTests::test_ctor_value_type_not_IField src/zope/schema/tests/test__field.py::DictTests::test_instance_conforms_to_iface src/zope/schema/tests/test__field.py::DictTests::test_mapping src/zope/schema/tests/test__field.py::DictTests::test_mutable_mapping src/zope/schema/tests/test__field.py::DictTests::test_validate_invalid_key_type src/zope/schema/tests/test__field.py::DictTests::test_validate_invalid_value_type src/zope/schema/tests/test__field.py::DictTests::test_validate_max_length src/zope/schema/tests/test__field.py::DictTests::test_validate_min_length src/zope/schema/tests/test__field.py::DictTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::DictTests::test_validate_not_required src/zope/schema/tests/test__field.py::DictTests::test_validate_required src/zope/schema/tests/test__field.py::DictTests::test_validate_wrong_types
src/zope/schema/_field.py src/zope/schema/_bootstrapfields.py CHANGES.rst docs/api.rst src/zope/schema/__init__.py
src/zope/schema/_field.py src/zope/schema/_bootstrapfields.py CHANGES.rst docs/api.rst src/zope/schema/__init__.py