Introduction à l'apprentissage de base de Python
En Python, les noms dont la première lettre est en majuscule font référence aux classes. Les crochets dans cette définition de classe sont vides car nous créons cette classe à partir d'un espace vide. Nous avons écrit une docstring décrivant les fonctionnalités de cette classe. Les fonctions d'une classe sont appelées méthodes .
Prenons l'exemple de la classe Student. En Python, la définition d'une classe se fait via le mot-clé class :
class Student(object): pass |
class Student(object):
def __init__(self, name, score): self.name = name self.score = score |
9.1.1 Créer une classe def __init__(self, name, score): self.name = nom self.score = score 1. La méthode __init__() est une méthode spéciale qui l'exécutera automatiquement lors de la création d'une nouvelle instance. Il y a deux traits de soulignement au début et à la fin. Il s'agit d'une convention pour éviter les conflits de noms entre les méthodes Python par défaut et les méthodes ordinaires. Dans la définition de cette méthode, le paramètre formel self est essentiel et doit être situé 4.self.name= name Les variables comme celle-ci, accessibles via les instances, sont appelées attributs fonctions qui encapsulent les données class Student(object): name = 'Student' Lors de l'écriture d'un programme, n'utilisez jamais le même nom pour les attributs d'instance et les attributs de classe, car les attributs d'instance portant le même nom bloqueront les attributs de classe, mais lorsque vous supprimez les attributs d'instance, utilisez à nouveau le même nom pour accéder à ce qui arrive. seront des attributs de classe. Vous pouvez modifier la valeur de l'attribut de trois manières différentes : 1. Modifier directement via l'instance class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score)) def __init__(soi, nom, score): >>> bart = Student('Bart Simpson', 98) >>> bart.__name Traceback (most recent call last): File " AttributeError: 'Student' object has no attribute '__name' class Student(object): ... def get_name(self): return self.__name def get_score(self): return self.__score class Student(object): ... def set_score(self, score): self.__score = score class Student(object): ... def set_score(self, score): if 0 <= score <= 100: self.__score = score else: raise ValueError('bad score') 7. Il convient de noter qu'en Python, les noms de variables sont similaires à __xxx__, c'est-à-dire qu'ils commencent par un double trait de soulignement et se terminent par un double trait de soulignement, ce sont des variables spéciales accessibles directement et ne sont pas privées. . variables, donc les noms de variables tels que __name__ et __score__ ne peuvent pas être utilisés. Parfois, vous verrez des noms de variables d'instance commençant par un trait de soulignement, tel que _name. Cependant, selon la convention, lorsque vous voyez une telle variable, cela signifie "Bien que je puisse le faire". être accessible, veuillez me traiter comme une variable privée et ne pas y accéder à volonté." 8. Les variables d'instance commençant par des doubles traits de soulignement ne sont pas nécessairement accessibles de l'extérieur. La raison pour laquelle __name n'est pas accessible directement est que l'interpréteur Python modifie en externe la variable __name en _Student__name, de sorte que la variable __name est toujours accessible via _Student__name. 1. Si une classe est similaire à une version spéciale d'une autre classe, vous pouvez utiliser l'héritage. Si une classe hérite d'une autre classe, elle obtiendra automatiquement toutes les propriétés et méthodes. de l'autre classe. La classe d'origine est la classe parent et la nouvelle classe est la classe enfant. 2. La sous-classe hérite de tous les attributs et méthodes de la classe parent, et peut également définir ses propres attributs et méthodes. En programmation POO, lorsque nous définissons une classe, elle peut hériter d'une classe existante. La nouvelle classe est appelée une sous-classe (Sous-classe) et la classe héritée est appelée une classe de base, une classe parent ou une super classe (Classe de base, Super. classe). class Dog(Animal): #继承Animal passclasse Étudiant(objet): point
Nous avons écrit le code suivant pour accéder à la valeur du nom d'attribut de my_dog. my_dog.name La notation point est très couramment utilisée en Python. Cette syntaxe montre comment Python apprend la valeur d'un attribut. 2. Après avoir créé une instance basée sur la classe Dog, vous pouvez utiliser la notation point pour appeler n'importe quelle méthode définie dans la classe Dog. 3. Vous pouvez créer n'importe quel nombre d'instances en fonction de la classe selon vos besoins. 9.2 Utilisation de classes et d'instances
1. Une tâche importante que vous devez effectuer est de modifier les propriétés de l'instance. Vous pouvez modifier les propriétés d'une instance directement ou écrire des méthodes pour les modifier d'une manière spécifique. 2. Une classe est un modèle pour créer des instances, et les instances sont des objets spécifiques. Les données appartenant à chaque instance sont indépendantes les unes des autres et ne s'affectent pas. La méthode est la fonction liée à l'instance. , et la fonction ordinaire Différemment, les méthodes peuvent accéder directement aux données de l'instance ; en appelant la méthode sur l'instance, nous exploitons directement les données à l'intérieur de l'objet, mais il n'est pas nécessaire de connaître les détails d'implémentation à l'intérieur de la méthode. Contrairement aux langages statiques, Python permet de lier n'importe quelle donnée à des variables d'instance, c'est-à-dire que pour deux variables d'instance, bien qu'il s'agisse d'instances différentes de la même classe, elles peuvent avoir des noms de variable différents. 9.2.1 Définir la valeur initiale de la classe Chaque attribut de la classe doit avoir une valeur initiale, même si la valeur est 0 ou une chaîne vide. Dans certains cas, comme lors de la définition d'une valeur par défaut, il est possible de spécifier une telle valeur initiale dans la méthode __init__() ; si vous faites cela pour un attribut, vous n'avez pas besoin d'inclure des paramètres formels qui lui fournissent une initiale ; valeur. Définissez les attributs directement dans la classe, qui sont des attributs de classe :
classe Étudiant(objet) : nom = 'Étudiant' 9.2.2 Modifier la valeur de l'attribut
<🎜> 3. Après la modification, il n'y a aucun changement dans le code externe, mais la variable d'instance .__name et la variable d'instance .__score ne sont plus accessibles de l'extérieur : <🎜>
classe Étudiant (objet) :
self.__name = nom self.__score = score
def print_score(self): print('%s: %s' % (self.__name, self.__score))
4. Cela garantit que le code externe ne peut pas modifier l'état interne de l'objet à volonté, de sorte que via la protection des restrictions d'accès, le code Plus robuste. Mais si un code externe souhaite obtenir le nom et le score, vous pouvez ajouter des méthodes comme get_name et get_score à la classe Student : <🎜>>>> bart = Étudiant('Bart Simpson', 98)>>> bart.__name Traceback (dernier appel le plus récent) : Fichier "
5 . Si Pour permettre au code externe de modifier la partition, vous pouvez ajouter la méthode set_score à la classe Student : class Student(object): ... def get_name(self): return self.__name def get_score(self): return self.__score
6. Par rapport aux paramètres d'appel direct d'origine, dans la méthode, les paramètres peuvent être vérifiés pour éviter de transmettre des paramètres non valides : class Étudiant(objet): ... def set_score(self, score): self.__score = score classe Étudiant(objet) : .. . def set_score(self, score): if 0 <= score <= 100 :<🎜><🎜> self.__score = score<🎜><🎜> else :<🎜> <🎜> augmenter ValueError('mauvais score')<🎜> 9.3 Héritage
classe Chien(Animal) : #Hériter un animal
pass
3. Lors de la définition d'une sous-classe, le nom de la classe parent doit être précisé entre parenthèses.
4.La fonction spéciale super()
aide Python à connecter les classes parentes et les sous-classes en parallèle. La classe parent est également appelée super classe, l'origine de super. 9.3.2 Définir les méthodes et attributs des sous-classes Laisser une classe hériter d'une classe. Vous pouvez ajouter des propriétés et des méthodes qui distinguent les sous-classes des classes parentes. 9.3.3 Réécriture de la classe parent Les méthodes correspondant à la classe parent ne peuvent être réécrites que si elles ne répondent pas aux besoins de la sous-classe. Ajoutez de nouvelles méthodes à la sous-classe pour décrire la. caractéristiques de la sous-classe. Débarrassez-vous du pire de la catégorie parentale et prenez le meilleur. 9.3.4 Polymorphisme 1. Lorsque la même méthode existe à la fois dans la sous-classe et dans la classe parent, on dit que la sous-classe remplace la méthode de la classe parent lorsque le code est en cours d'exécution. , Les méthodes de sous-classe sont toujours appelées. De cette façon, nous obtenons un autre avantage de l'héritage : le polymorphisme 2. Par conséquent, dans la relation d'héritage, si le type de données d'une instance est une sous-classe, son type de données peut également être considéré comme Est la classe parent . Cependant, l’inverse n’est pas vrai. 3. L'avantage du polymorphisme est que lorsqu'on doit passer en Chien, Chat, Tortue..., il suffit de recevoir le type Animal, car Chien, Chat, Tortue... sont tous des Animaux types , puis opèrez simplement en fonction du type Animal. Puisque le type Animal a une méthode run(), tout type transmis, tant qu'il s'agit d'une classe ou d'une sous-classe Animal, appellera automatiquement la méthode run() du type réel. C'est ce que signifie le polymorphisme.- 4. Pour une variable, il suffit de savoir qu'elle est de type Animal, sans connaître exactement son sous-type, on peut appeler en toute sécurité la méthode run(), et la méthode run() spécifique appelée est la function Qu'il s'agisse d'un objet Animal, Chien, Chat ou Tortue est déterminé par le type exact de l'objet au moment de l'exécution. C'est le véritable pouvoir du polymorphisme : l'appelant ne se soucie que de l'appel, quels que soient les détails, et lorsque nous ajoutons. une nouvelle sous-classe d'Animal, assurez-vous simplement que la méthode run() est écrite correctement, quelle que soit la façon dont le code d'origine est appelé. C'est le fameux principe "ouvert et fermé" :
- Ouvert pour extension : de nouvelles sous-classes d'Animaux sont autorisées
class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 |
<🎜>classe Étudiant (objet) :<🎜><🎜> __slots__ = ('name', 'age') # Utilisez un tuple pour définir les noms d'attributs qui peuvent être liés <🎜> |
Lorsque vous utilisez __slots__, veuillez noter que les attributs définis par __slots__ n'affectent que l'instance de classe actuelle et n'ont aucun effet sur les sous-classes héritées.
9.3.6 Héritage multiple
1. Grâce à l'héritage multiple, une sous-classe peut obtenir toutes les fonctions de plusieurs classes parents en même temps.
2. Lors de la conception de la relation d'héritage des classes, la ligne principale est généralement héritée d'une seule source. Par exemple, Ostrich hérite de Bird. Cependant, si vous avez besoin de « mélanger » des fonctionnalités supplémentaires, vous pouvez y parvenir grâce à un héritage multiple. Par exemple, laissez Ostrich hériter de Runnable en plus d'hériter de Bird. Cette conception est souvent appelée MixIn. Le but de MixIn est d'ajouter plusieurs fonctions à une classe. De cette façon, lors de la conception d'une classe, nous donnons la priorité à la combinaison de plusieurs fonctions MixIn via un héritage multiple au lieu de concevoir des relations d'héritage complexes à plusieurs niveaux.
3. De cette façon, nous n'avons pas besoin d'une chaîne d'héritage compliquée et énorme. Tant que nous choisissons de combiner les fonctions de différentes classes, nous pouvons rapidement construire les sous-classes requises. Puisque Python autorise l’héritage multiple, MixIn est une conception courante. Les langages qui n'autorisent qu'un héritage unique (comme Java) ne peuvent pas utiliser la conception de MixIn.
9.3.7 Classes personnalisées
1. Il existe de nombreuses fonctions spéciales dans les classes Python qui peuvent nous aider à personnaliser les classes.
__str__
Après avoir défini la méthode __str__(), vous pouvez renvoyer une jolie chaîne :
... self.name = nom
... def __str__(self): ... return 'Objet étudiant (nom : %s)' % self.name
|
class Fib(object): def __init__(self): self.a, self.b = 0, 1 # 初始化两个计数器a,b
def __iter__(self): return self # 实例本身就是迭代对象,故返回自己
def __next__(self): self.a, self.b = self.b, self.a + self.b # 计算下一个值 if self.a > 100000: # 退出循环的条件 raise StopIteration() return self.a # 返回下一个值 |
Tapez les variables directement sans les imprimer. L'exemple imprimé n'a toujours pas l'air bien :
|
class Student(object): def __init__(self, name): self.name = name def __str__(self): return 'Objet étudiant (name=%s)' % self.name __repr__ = __str__ |
>>> pour n dans Fib() :... imprimer (n)...1 1235 ...4636875025 |
__getitem__
Bien que l'instance Fib puisse être utilisée dans des boucles for et ressemble un peu à une liste, il n'est toujours pas possible de l'utiliser comme liste. Par exemple, prenez le 5ème élément :
>>> >
TypeError : l'objet 'Fib' ne prend pas en charge l'indexation |
Pour se comporter comme une liste et supprimer des éléments en fonction des indices, vous devez implémenter la méthode __getitem__() :
class Fib(object):
def __getitem__(self, n ):
a, b = 1, 1
pour x dans la plage(n):
a, b = b, a + b
from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) |
from enum import EnumMois = Enum('Month', ('Jan', 'Feb', 'Mar', 'Avr', 'May', 'Jun', 'Jul', 'Août', ' Sep', 'Oct', 'Nov', 'Dec')) |
9.3.9 Métaclasse
type()
Pour créer un objet classe, la fonction type() passe 3 paramètres en séquence :
Le nom de la classe ;
Une collection de classes parents héritées. Notez que Python prend en charge l'héritage multiple. S'il n'y a qu'une seule classe parent, n'oubliez pas l'élément unique. méthode d'écriture du tuple ;
Le nom de la méthode de la classe est lié à la fonction. Ici, nous lions la fonction fn au nom de la méthode bonjour.
métaclasse
Métaclasse, traduit littéralement par métaclasse, l'explication simple est : après avoir défini une classe, nous pouvons créer une instance basée sur cette classe, donc : d'abord Définissez la classe, puis créez des instances. Mais que se passe-t-il si nous voulons créer une classe ? Ensuite, vous devez créer une classe basée sur la métaclasse, donc : définissez d'abord la métaclasse, puis créez la classe. La connexion est la suivante : définissez d’abord la métaclasse, puis vous pouvez créer la classe et enfin créer l’instance. Les paramètres reçus par la méthode
__new__() sont :
L'objet de la classe en cours de création ;
class Le nom ; la collection de classes parent héritées par la classe
; la collection de méthodes de la classe
.
9.3.10 Utiliser des instances comme propriétés
Lorsque vous utilisez du code pour simuler des objets réels, vous trouverez des propriétés et des méthodes à mesure que vous ajoutez de plus en plus de fonctionnalités et de détails. Et les fichiers de code deviennent de plus en plus longs, une partie d'entre eux peut être séparée et réorganisée en classe. Une grande catégorie peut être divisée en plusieurs sous-catégories.
9.3.11 Simulation d'objets physiques
Pour simuler des objets physiques plus complexes, vous devez les considérer à partir d'un niveau logique supérieur. Afin d'écrire du code plus efficace, concis et précis, vous devrez peut-être constamment réorganiser les cours.
9.4 Importation de classes
1. Au fur et à mesure que des classes continuent d'être ajoutées, même un excellent héritage rendra le code très long, donc python vous permet d'importer des classes dans des modules. Et importez les modules requis pour les utiliser dans le programme principal.
2. Rédigez une chaîne de documentation pour chaque module, expliquez la fonction du module et décrivez brièvement le contenu.
3. Importez plusieurs classes d'un module, séparez-les par des virgules et créez des instances selon vos besoins.
4. Vous pouvez également importer la classe entière, ajouter le nom de la classe avant l'instance et accéder à la classe requise.
5. Importez un module dans un autre module.
9.5 bibliothèque standard python (module)
La bibliothèque standard Python est un ensemble de modules qui peuvent être importés et utilisés uniquement avec l'instruction import.
Les dictionnaires vous permettent d'associer des informations, mais n'enregistrent pas l'ordre dans lequel vous ajoutez des paires clé-valeur. Pour créer un dictionnaire et enregistrer l'ordre dans lequel vous ajoutez des paires clé-valeur, vous pouvez utiliser le orderDict. classe dans le module collections. Les instances de OrderedDict sont identiques aux dictionnaires, mais enregistrent l'ordre dans lequel les paires clé-valeur sont ajoutées.
OrderdDict est très bien, il possède à la fois les caractéristiques d'une liste et d'un dictionnaire, ce qui est parfois nécessaire.
module aléatoire
Contient des fonctions permettant de générer des nombres aléatoires de différentes manières. Où randint() renvoie un entier dans la plage spécifiée.
datetime est un module
Le module datetime contient également une classe datetime La classe datetime est importée via from datetime import datetime. Si vous importez uniquement import datetime, vous devez citer le nom complet datetime.datetime.
datetime.now() renvoie la date et l'heure actuelles, son type est datetime.
Bibliothèques tierces couramment utilisées
Il existe également des pilotes MySQL : mysql-connector-python, la bibliothèque NumPy pour le calcul scientifique : numpy, l'outil de modèle Jinja2 pour générer du texte, etc.
1.urlparse module, le module urlpasrse fournit quelques fonctions de base pour le traitement des chaînes d'URL. Ces fonctions incluent urlparse(), urlunparse() et urljoin().
2.urlparse() analyse urlstr en un 6-tuple (prot_sch, net_loc, path, params, query, frag). Chaque composant ici a été décrit précédemment.
3. La fonction de urlunparse() est complètement opposée à urlpase(). Elle génère un urltup 6-tuple (prot_sch, net_loc, path, params, query, frag) à partir de l'URL traitée par urlparse(), et le fusionne dans une URL et renvoie.
4. Le module urllib fournit de nombreuses fonctions qui peuvent être utilisées pour télécharger des données à partir d'une URL spécifiée. Il peut également encoder et décoder des chaînes afin qu'elles puissent être affichées sous la forme correcte dans l'URL. Les fonctions à présenter ci-dessous incluent urlopen(), urlretrieve(), quote(), unquote(), quote_plus(), unquote_plus() et urlencode().
5.urlopen() ouvre une connexion Web représentée par une chaîne URL donnée et renvoie un objet de type fichier.
6. urlretrieve() ne sert pas à accéder et à ouvrir l'URL sous forme de fichier, mais à télécharger le HTML complet et à l'enregistrer sous forme de fichier.
9.6 Style de codage des classes
Être familier avec le style de codage lié aux classes, surtout lorsque le programme est complexe.
1. Le nom de la classe doit utiliser la méthode de dénomination en casse chameau , c'est-à-dire que la première lettre de la classe est en majuscule, sans traits de soulignement, tandis que la première lettre du nom de l'instance et du module le nom est en minuscules et les traits de soulignement sont utilisés pour relier les mots.
2. Ajoutez une description de chaîne de documentation après chaque définition de classe pour décrire brièvement la fonction de la classe, et ajoutez une description de chaîne de documentation sous chaque module pour décrire ce que les classes sous le module peuvent faire.
3. Utilisez des lignes vides pour organiser le code, mais n'en abusez pas. Vous pouvez utiliser une ligne vide pour séparer les méthodes dans une classe et utiliser deux lignes vides pour séparer les classes.
4. Lorsque vous devez importer des modules dans la bibliothèque standard et des modules écrits par vous-même en même temps, écrivez d'abord l'instruction d'importation pour importer le module de bibliothèque standard, séparé par une ligne vide, puis importez le déclaration d'importation de module que vous avez écrite. Lorsque plusieurs instructions d'importation sont incluses, il est plus facile de comprendre l'origine de chaque module du programme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Il n'y a pas de fonction de somme intégrée dans le langage C, il doit donc être écrit par vous-même. La somme peut être obtenue en traversant le tableau et en accumulant des éléments: Version de boucle: la somme est calculée à l'aide de la longueur de boucle et du tableau. Version du pointeur: Utilisez des pointeurs pour pointer des éléments de tableau, et un résumé efficace est réalisé grâce à des pointeurs d'auto-incitation. Allouer dynamiquement la version du tableau: allouer dynamiquement les tableaux et gérer la mémoire vous-même, en veillant à ce que la mémoire allouée soit libérée pour empêcher les fuites de mémoire.

Bien que distincts et distincts soient liés à la distinction, ils sont utilisés différemment: distinct (adjectif) décrit le caractère unique des choses elles-mêmes et est utilisée pour souligner les différences entre les choses; Distinct (verbe) représente le comportement ou la capacité de distinction, et est utilisé pour décrire le processus de discrimination. En programmation, distinct est souvent utilisé pour représenter l'unicité des éléments d'une collection, tels que les opérations de déduplication; Distinct se reflète dans la conception d'algorithmes ou de fonctions, tels que la distinction étrange et uniforme des nombres. Lors de l'optimisation, l'opération distincte doit sélectionner l'algorithme et la structure de données appropriés, tandis que l'opération distincte doit optimiser la distinction entre l'efficacité logique et faire attention à l'écriture de code clair et lisible.

Il n'y a pas de salaire absolu pour les développeurs Python et JavaScript, selon les compétences et les besoins de l'industrie. 1. Python peut être davantage payé en science des données et en apprentissage automatique. 2. JavaScript a une grande demande dans le développement frontal et complet, et son salaire est également considérable. 3. Les facteurs d'influence comprennent l'expérience, la localisation géographique, la taille de l'entreprise et les compétences spécifiques.

! x Compréhension! X est un non-opérateur logique dans le langage C. Il booléen la valeur de x, c'est-à-dire que les véritables modifications sont fausses et fausses modifient true. Mais sachez que la vérité et le mensonge en C sont représentés par des valeurs numériques plutôt que par les types booléens, le non-zéro est considéré comme vrai, et seul 0 est considéré comme faux. Par conséquent,! X traite des nombres négatifs de la même manière que des nombres positifs et est considéré comme vrai.

Il n'y a pas de fonction de somme intégrée en C pour la somme, mais il peut être implémenté par: en utilisant une boucle pour accumuler des éléments un par un; Utilisation d'un pointeur pour accéder et accumuler des éléments un par un; Pour les volumes de données importants, envisagez des calculs parallèles.

La page H5 doit être maintenue en continu, en raison de facteurs tels que les vulnérabilités du code, la compatibilité des navigateurs, l'optimisation des performances, les mises à jour de sécurité et les améliorations de l'expérience utilisateur. Des méthodes de maintenance efficaces comprennent l'établissement d'un système de test complet, à l'aide d'outils de contrôle de version, de surveiller régulièrement les performances de la page, de collecter les commentaires des utilisateurs et de formuler des plans de maintenance.

Copier et coller le code n'est pas impossible, mais il doit être traité avec prudence. Des dépendances telles que l'environnement, les bibliothèques, les versions, etc. dans le code peuvent ne pas correspondre au projet actuel, entraînant des erreurs ou des résultats imprévisibles. Assurez-vous de vous assurer que le contexte est cohérent, y compris les chemins de fichier, les bibliothèques dépendantes et les versions Python. De plus, lors de la copie et de la collation du code pour une bibliothèque spécifique, vous devrez peut-être installer la bibliothèque et ses dépendances. Les erreurs courantes incluent les erreurs de chemin, les conflits de version et les styles de code incohérents. L'optimisation des performances doit être redessinée ou refactorisée en fonction de l'objectif d'origine et des contraintes du code. Il est crucial de comprendre et de déboguer le code copié, et de ne pas copier et coller aveuglément.

Comment obtenir des données dynamiques de la page de travail 58.com tout en rampant? Lorsque vous rampez une page de travail de 58.com en utilisant des outils de chenilles, vous pouvez rencontrer cela ...
