'Construct a new :class:`.AssociationProxy`.
The :func:`.association_proxy` function is provided as the usual
entrypoint here, though :class:`.AssociationProxy` can be instantiated
and/or subclassed directly.
:param target_collection: Name of the collection we\'ll proxy to,
usually created with :func:`.relationship`.
:param attr: Attribute on the collected instances we\'ll proxy
for.  For example, given a target collection of [obj1, obj2], a
list created by this proxy property would look like
[getattr(obj1, attr), getattr(obj2, attr)]
:param creator: Optional. When new items are added to this proxied
collection, new instances of the class collected by the target
collection will be created.  For list and set collections, the
target class constructor will be called with the \'value\' for the
new instance.  For dict types, two arguments are passed:
key and value.
If you want to construct instances differently, supply a \'creator\'
function that takes arguments as above and returns instances.
:param getset_factory: Optional.  Proxied attribute access is
automatically handled by routines that get and set values based on
the `attr` argument for this proxy.
If you would like to customize this behavior, you may supply a
`getset_factory` callable that produces a tuple of `getter` and
`setter` functions.  The factory is called with two arguments, the
abstract type of the underlying collection and this proxy instance.
:param proxy_factory: Optional.  The type of collection to emulate is
determined by sniffing the target collection.  If your collection
type can\'t be determined by duck typing or you\'d like to use a
different collection implementation, you may supply a factory
function to produce those collections.  Only applicable to
non-scalar relationships.
:param proxy_bulk_set: Optional, use with proxy_factory.  See
the _set() method for details.'

def __init__(self, target_collection, attr, creator=None, getset_factory=None, proxy_factory=None, proxy_bulk_set=None):

    self.target_collection = target_collection
    self.value_attr = attr
    self.creator = creator
    self.getset_factory = getset_factory
    self.proxy_factory = proxy_factory
    self.proxy_bulk_set = proxy_bulk_set
    self.owning_class = None
    self.key = ('_%s_%s_%s' % (type(self).__name__, target_collection, id(self)))
    self.collection_class = None
