code: def __setattr__(self, attr: str, value: Any):
      super().__setattr__(attr, value)
      # Make sure to recompute the hash in case any of the hashed attributes
      # change (though we do not expect `mesh` or `placements` to change)
      if hasattr(self, "_hash") and attr in (
          "mesh",
          "placements",
          "tensor_meta",
      ):
          self._hash = None
  
imports: from dataclasses import dataclass
  from typing import Any, cast, List, NamedTuple, Optional, Tuple
  import torch
  import torch.distributed._functional_collectives
  import torch.distributed.distributed_c10d
  from torch.distributed._tensor._collective_utils import mesh_broadcast, mesh_scatter
  from torch.distributed.device_mesh import DeviceMesh
label_desc: Use image node_id 2 for calling the DTensorSpec obj's underlying member method code with example usage: obj.__setattr__(attr, value) without return types