Here is another approach exploiting the append after command
option. The point is that, by referring to the anchor \tikzlastnode.center
one might add, relatively to that position, labels.
The new style able to accomplish this task is my label
:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.center) node [#1] {#2}
}
}
}
A mwe:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.center) node [#1] {#2}
}
}
}
\begin{document}
\tikz \node [circle,draw,my label={red,above=0.15cm:X}] {my circle};
\tikz \node [circle,draw,my label={red,below=0.15cm:X}] {my circle};
\end{document}
which gives as results:


The style accepts at first argument any TikZ option, so it is easy to customize colors and position: indeed, it is better to adjust a bit the offset to not overlap the text.
If, instead, one knows that the label always has to be placed below the "north border", well, the best thing to do is to change the my label
style into:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.north) node [#1] {#2}
}
}
}
In such a way, just setting:
\tikz\node [circle,draw,my label={red,below:X}] {my circle};
allows to achieve the target.
A mwe:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.north) node [#1] {#2}
}
}
}
\begin{document}
\begin{tikzpicture}
\node [circle,draw,my label={red,below:X}] {my circle};
\node [circle,draw,my label={red,below=0.15cm:X},xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}
The result:

Revision
The previous method suffer, as said in the comments, if more than one label should be introduced. But this is perfectly doable if rather than introducing nodes, we introduce coordinates with labels.
The code:
\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={[#1]#2:#3}{
append after command={
(\tikzlastnode.center) coordinate[label={[label distance=0.1cm,#1]#2:#3}]
}
},
}
\begin{document}
\begin{tikzpicture}
\node [circle,
draw,
my label={[red]above:X},
my label={[green!70!blue]below:Y},
my label={[blue,yshift=0.3cm]above:Z}] {my circle};
\node [circle,
draw,
my label={[blue,yshift=-0.15cm]below:X},
my label={[green!70!blue]70:Z},
my label={[orange!80!red]130:Y},
xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}
The result:

Notice: by using the label distance
within the option definition, allows to not have the label text overlapped when one just says:
\tikz\node [circle,draw,my label={[red]below:X}] {my circle};