<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def ModifyInstance(self, ModifiedInstance, IncludeQualifiers=None, PropertyList=None, **extra):
 # pylint: disable=invalid-name,line-too-long """ Modify the property values of an instance. This method performs the ModifyInstance operation (see :term:`DSP0200`). See :ref:`WBEM operations` for a list of all methods performing such operations. The `PropertyList` parameter determines the set of properties that are designated to be modified (see its description for details). The properties provided in the `ModifiedInstance` parameter specify the new property values for the properties that are designated to be modified. Pywbem sends the property values provided in the `ModifiedInstance` parameter to the WBEM server as provided; it does not add any default values for properties not provided but designated to be modified, nor does it reduce the properties by those not designated to be modified. The properties that are actually modified by the WBEM server as a result of this operation depend on a number of things: * The WBEM server will reject modification requests for key properties and for properties that are not exposed by the creation class of the target instance. * The WBEM server may consider some properties as read-only, as a result of requirements at the CIM modeling level (schema or management profiles), or as a result of an implementation decision. Note that the WRITE qualifier on a property is not a safe indicator as to whether the property can actually be modified. It is an expression at the level of the CIM schema that may or may not be considered in DMTF management profiles or in implementations. Specifically, a qualifier value of True on a property does not guarantee modifiability of the property, and a value of False does not prevent modifiability. * The WBEM server may detect invalid new values or conflicts resulting from the new property values and may reject modification of a property for such reasons. If the WBEM server rejects modification of a property for any reason, it will cause this operation to fail and will not modify any property on the target instance. If this operation succeeds, all properties designated to be modified have their new values (see the description of the `ModifiedInstance` parameter for details on how the new values are determined). Note that properties (including properties not designated to be modified) may change their values as an indirect result of this operation. For example, a property that was not designated to be modified may be derived from another property that was modified, and may show a changed value due to that. If the operation succeeds, this method returns. Otherwise, this method raises an exception. Parameters: ModifiedInstance (:class:`~pywbem.CIMInstance`):
 A representation of the modified instance, also indicating its instance path. The `path` attribute of this object identifies the instance to be modified. Its `keybindings` attribute is required. If its `namespace` attribute is `None`, the default namespace of the connection will be used. Its `host` attribute will be ignored. The `classname` attribute of the instance path and the `classname` attribute of the instance must specify the same class name. The properties defined in this object specify the new property values (including `None` for NULL). If a property is designated to be modified but is not specified in this object, the WBEM server will use the default value of the property declaration if specified (including `None`), and otherwise may update the property to any value (including `None`). Typically, this object has been retrieved by other operations, such as :meth:`~pywbem.WBEMConnection.GetInstance`. IncludeQualifiers (:class:`py:bool`):
 Indicates that qualifiers are to be modified as specified in the `ModifiedInstance` parameter, as follows: * If `False`, qualifiers not modified. * If `True`, qualifiers are modified if the WBEM server implements support for this parameter. * If `None`, this parameter is not passed to the WBEM server, and causes the server-implemented default to be used. :term:`DSP0200` defines that the server-implemented default is `True`. This parameter has been deprecated in :term:`DSP0200`. Clients cannot rely on qualifiers to be modified. PropertyList (:term:`string` or :term:`py:iterable` of :term:`string`):
 This parameter defines which properties are designated to be modified. This parameter is an iterable specifying the names of the properties, or a string that specifies a single property name. In all cases, the property names are matched case insensitively. The specified properties are designated to be modified. Properties not specified are not designated to be modified. An empty iterable indicates that no properties are designated to be modified. If `None`, DSP0200 states that the properties with values different from the current values in the instance are designated to be modified, but for all practical purposes this is equivalent to stating that all properties exposed by the instance are designated to be modified. **extra : Additional keyword arguments are passed as additional operation parameters to the WBEM server. Note that :term:`DSP0200` does not define any additional parameters for this operation. Raises: Exceptions described in :class:`~pywbem.WBEMConnection`. """
  # noqa: E501

        exc = None
        method_name = 'ModifyInstance'

        if self._operation_recorders:
            self.operation_recorder_reset()
            self.operation_recorder_stage_pywbem_args(
                method=method_name,
                ModifiedInstance=ModifiedInstance,
                IncludeQualifiers=IncludeQualifiers,
                PropertyList=PropertyList,
                **extra)

        try:

            stats = self.statistics.start_timer('ModifyInstance')
            # Must pass a named CIMInstance here (i.e path attribute set)
            if ModifiedInstance.path is None:
                raise ValueError(
                    'ModifiedInstance parameter must have path attribute set')
            if ModifiedInstance.path.classname is None:
                raise ValueError(
                    'ModifiedInstance parameter must have classname set in '
                    ' path')
            if ModifiedInstance.classname is None:
                raise ValueError(
                    'ModifiedInstance parameter must have classname set in '
                    'instance')

            namespace = self._iparam_namespace_from_objectname(
                ModifiedInstance.path, 'ModifiedInstance.path')
            PropertyList = _iparam_propertylist(PropertyList)

            # Strip off host and namespace to avoid producing an INSTANCEPATH or
            # LOCALINSTANCEPATH element instead of the desired INSTANCENAME
            # element.
            instance = ModifiedInstance.copy()
            instance.path.namespace = None
            instance.path.host = None

            self._imethodcall(
                method_name,
                namespace,
                ModifiedInstance=instance,
                IncludeQualifiers=IncludeQualifiers,
                PropertyList=PropertyList,
                has_return_value=False,
                **extra)
            return

        except (CIMXMLParseError, XMLParseError) as exce:
            exce.request_data = self.last_raw_request
            exce.response_data = self.last_raw_reply
            exc = exce
            raise
        except Exception as exce:
            exc = exce
            raise
        finally:
            self._last_operation_time = stats.stop_timer(
                self.last_request_len, self.last_reply_len,
                self.last_server_response_time, exc)
            if self._operation_recorders:
                self.operation_recorder_stage_result(None, exc)