typing.NamedTuple was already mentioned in this discussion, I just would like to add few comments:

1. I think that changing Python syntax to support declarative classes is not a realistic option in nearby future.
In contrast, there is an existing syntax change - variable annotations - that can be actively experimented with.
Variable annotations are designed to play well with metaclass machinery, for example, they will respect
__prepare__ method, if it injects __annotations__ as a custom mapping, etc.

2. Possible strategy for declarative classes could be developing independent *composable* mixins/traits:

  @comparable
  @pickleable
  class MyClass:
      x: int
      y: int

or

  class MyClass(Comparable, Pickleable):
      x: int
      y: int

The problem with the second approach is that it can lead to metaclass conflicts. A possible solution will
be to provide a standard metaclass for mixins in stdlib.

3. Composability could be a problem if only normal variable assignments are used: after one mixin transforms the class,
the original declarations are lost. Simple possible solution would be to agree that mixins should *not* modify
__annotations__, only __dict__. Currently, PEP 484 and PEP 526 specify that preferable use of annotations is type
declarations. However, I think this can be generalized to just declarations. For example, by providing a special typing
construct that will allow additional info apart from type:

  def large(val):
      return val > 42

  @comparable
  @pickleable
  class MyClass
      x: Spec(int, validator=large)
      y: Spec(List[int], default_factory=list)


--
Ivan