#sympy.vector.kind from sympy.core.kind import Kind, _NumberKind, NumberKind from sympy.core.mul import Mul class VectorKind(Kind): """ Kind for all vector objects in SymPy. Parameters ========== element_kind : Kind Kind of the element. Default is :class:`sympy.core.kind.NumberKind`, which means that the vector contains only numbers. Examples ======== Any instance of Vector class has kind ``VectorKind``: >>> from sympy.vector.coordsysrect import CoordSys3D >>> Sys = CoordSys3D('Sys') >>> Sys.i.kind VectorKind(NumberKind) Operations between instances of Vector keep also have the kind ``VectorKind``: >>> from sympy.core.add import Add >>> v1 = Sys.i * 2 + Sys.j * 3 + Sys.k * 4 >>> v2 = Sys.i * Sys.x + Sys.j * Sys.y + Sys.k * Sys.z >>> v1.kind VectorKind(NumberKind) >>> v2.kind VectorKind(NumberKind) >>> Add(v1, v2).kind VectorKind(NumberKind) Subclasses of Vector also have the kind ``VectorKind``, such as Cross, VectorAdd, VectorMul or VectorZero. See Also ======== sympy.core.kind.Kind sympy.matrices.kind.MatrixKind """ def __new__(cls, element_kind=NumberKind): obj = super().__new__(cls, element_kind) obj.element_kind = element_kind return obj def __repr__(self): return "VectorKind(%s)" % self.element_kind @Mul._kind_dispatcher.register(_NumberKind, VectorKind) def num_vec_mul(k1, k2): """ The result of a multiplication between a number and a Vector should be of VectorKind. The element kind is selected by recursive dispatching. """ if not isinstance(k2, VectorKind): k1, k2 = k2, k1 elemk = Mul._kind_dispatcher(k1, k2.element_kind) return VectorKind(elemk)