class Carte_a_jouer ():
    valeurs = (None, None, 2, 3, 4, 5, 6, 7, 8, 9, 10, "Valet", "Dame", "Roi", "As")
    couleurs = ("Coeur","Carreau","Trèfle","Pique")
    # None : Déclaration de la valeur sans valeur, les cartes 0 et 1 n'existant pas
    # les attributs statiques "valeurs" et "couleurs" sont déclarés à l'extérieur du constructeur
    # ils ne sont pas des attributs d'objet mais des attributs de classe !!!!!!!
    
    def __init__ (self,val,coul):
        self.valeur = val
        self.couleur = coul
        
    def affiche_carte (self):
        print (Carte_a_jouer.valeurs[self.valeur], "de", Carte_a_jouer.couleurs[self.couleur])
        
if __name__ == "__main__":
    carte = Carte_a_jouer (2,2)
    carte.affiche_carte ()

Exécution :

>>> 2 de Trèfle

Les attributs déclarés dans la classe au-dessus du constructeur (donc en-dehors de celui-ci) sont des attributs de classe statiques et non plus des attributs d’objets.

Rappel : if __name__ == “__main__”:le programme s’exécute directement, main signifiant principal, donc “programme principal”
Petite variante avec la fonction input ( ):

class Carte_a_jouer ():
    valeurs = (None, None, 2, 3, 4, 5, 6, 7, 8, 9, 10, "Valet", "Dame", "Roi", "As")
    couleurs = ("Coeur","Carreau","Trèfle","Pique")
    # None : Déclaration de la valeur sans valeur, les cartes 0 et 1 n'existant pas
    # les attributs statiques sont déclarés à l'extérieur du constructeur
    
    def __init__ (self,val,coul):
        self.valeur = val
        self.couleur = coul
        
    def affiche_carte (self):
        print (Carte_a_jouer.valeurs[self.valeur], "de", Carte_a_jouer.couleurs[self.couleur],\
               "est la carte que vous avez choisie")
        
if __name__ == "__main__":
    print ("""
Valeurs pour une carte : 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6,
                         7 : 7, 8 : 8, 9 : 9, 10 : 10 ,
                         11 : Valet, 12 : Dame, 13 : Roi, 14 : As
                        """)
    print ("""
Couleurs pour une carte : 0 : Coeur, 1 : Carreau, 2 : Trèfle, 3 : Pique
""")
    carte = Carte_a_jouer (val = int(input ("Valeur de la carte : ")),coul = int(input ("Couleur de la carte : ")))
    carte.affiche_carte ()

Exécution :

>>> 

Valeurs pour une carte : 2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6,
                         7 : 7, 8 : 8, 9 : 9, 10 : 10 ,
                         11 : Valet, 12 : Dame, 13 : Roi, 14 : As
                        

Couleurs pour une carte : 0 : Coeur, 1 : Carreau, 2 : Trèfle, 3 : Pique

Valeur de la carte : 13
Couleur de la carte : 2
Roi de Trèfle est la carte que vous avez choisie
>>>

Petit script plus simple pour comprendre la différence entre attribut de classe et attribut d’objet :

class Test (object) :
    a = "attribut de classe"

    def __init__ (self):

        self.b = "attribut d'objet"

if __name__ == "__main__":
    testDattribut = Test ( )
    print (testDattribut.b)
    print (Test.a)

Exécution :

>>> 
attribut d'objet
attribut de classe
>>>

Pour utiliser le(s) attribut(s) de classe, il est inutile de créer un objet de cette classe puisque l’attribut est une propriété de la classe !!!!!!

class Test (object) :
    a = "attribut de classe"

    def __init__ (self):

        self.b = "attribut d'objet"

if __name__ == "__main__":
    print (Test.a)

Exécution :

>>> 
attribut de classe
>>>