code: def read(self, entity=None, attrs=None, ignore=None, params=None):
          
          # read() should not change the state of the object it's called on, but
          # super() alters the attributes of any entity passed in. Creating a new
          # object and passing it to super() lets this one avoid changing state.
          if entity is None:
              entity = type(self)(
                  self._server_config,
                  host=self.host,  # pylint:disable=no-member
              )
          if attrs is None:
              attrs = self.read_json()
          if ignore is None:
              ignore = set()
          ignore.add('host')
          # type-specific fields
          if attrs['type'] != 'bmc':
              ignore.add('password')
              ignore.add('provider')
              ignore.add('username')
          if attrs['type'] != 'bond':
              ignore.add('mode')
              ignore.add('bond_options')
          if attrs['type'] != 'virtual':
              ignore.add('attached_to')
              ignore.add('tag')
          if attrs['type'] != 'bridge' and attrs['type'] != 'bond':
              ignore.add('attached_devices')
          return super(Interface, self).read(entity, attrs, ignore, params)
docs: Provide a default value for ``entity``.
  
          By default, ``nailgun.entity_mixins.EntityReadMixin.read`` provides a
          default value for ``entity`` like so::
  
              entity = type(self)()
  
          However, :class:`Interface` requires that a ``host`` must be provided,
          so this technique will not work. Do this instead::
  
              entity = type(self)(host=self.host)
  
          In addition, some of interface fields are specific to its ``type`` and
          are never returned for different ``type`` so ignoring all the redundant
          fields.