La quatrième partie d'une série d'articles sur les analogues en Python et JavaScript.
Dans cette partie: arguments de fonction, création et utilisation de classes, héritage, getters setter et propriétés de classe.
Résumé des parties précédentes:
- Première partie : conversion de type, opérateur ternaire, accès à une propriété par nom de propriété, dictionnaires, listes, chaînes, concaténation de chaînes.
- Deuxième partie : JSON, habitués, erreurs d'exception
- Troisième partie : Python et JS modernes: modèles de chaînes (lignes f), décompression de liste, fonctions lambda, itérations de liste, générateurs, ensembles.
Arguments de fonction
Python dispose d'une boîte à outils étendue pour travailler avec les arguments de fonction - il existe des valeurs par défaut, un nombre variable d'arguments positionnels et nommés ( *args
et **kwargs
).
Lorsque vous transmettez une valeur à une fonction, vous pouvez spécifier le nom de l'argument auquel cette valeur sera transmise. JS a également cette fonctionnalité.
Les valeurs par défaut des arguments de fonction peuvent être définies en Python:
from pprint import pprint def report(post_id, reason='not-relevant'): pprint({'post_id': post_id, 'reason': reason}) report(42) report(post_id=24, reason='spam')
Dans JS, de même:
function report(post_id, reason='not-relevant') { console.log({post_id: post_id, reason: reason}); } report(42); report(post_id=24, reason='spam');
Les arguments positionnels en Python peuvent être traités à l'aide de l'opérateur *
:
from pprint import pprint def add_tags(post_id, *tags): pprint({'post_id': post_id, 'tags': tags}) add_tags(42, 'python', 'javascript', 'django')
Dans JS, les arguments positionnels sont traités à l'aide de l'opérateur ...
:
function add_tags(post_id, ...tags) { console.log({post_id: post_id, tags: tags}); } add_tags(42, 'python', 'javascript', 'django');
Les arguments nommés sont souvent utilisés en Python lorsque vous devez passer un nombre variable d'arguments:
from pprint import pprint def create_post(**options): pprint(options) create_post( title='Hello, World!', content='This is our first post.', is_published=True, ) create_post( title='Hello again!', content='This is our second post.', )
La transmission d'un ensemble d'arguments nommés à JS est implémentée à l'aide d'un dictionnaire ( options
dans cet exemple):
function create_post(options) { console.log(options); } create_post({ 'title': 'Hello, World!', 'content': 'This is our first post.', 'is_published': true }); create_post({ 'title': 'Hello again!', 'content': 'This is our second post.' });
Classes et héritage
Python est un langage orienté objet. À partir d'ECMAScript 6, JS vous permet également d'écrire du code orienté objet sans astuces ni syntaxe.
Python Nous créons une classe, un constructeur et une méthode pour la représentation textuelle de l'objet:
class Post(object): def __init__(self, id, title): self.id = id self.title = title def __str__(self): return self.title post = Post(42, 'Hello, World!') isinstance(post, Post) == True print(post)
Actions similaires sur JS:
class Post { constructor (id, title) { this.id = id; this.title = title; } toString() { return this.title; } } post = new Post(42, 'Hello, World!'); post instanceof Post === true; console.log(post.toString());
Créez deux classes Article
et Link
en Python qui hériteront de la classe Post
. Vous pouvez remarquer que nous utilisons la super
fonction pour accéder aux méthodes de la classe de base Post
:
class Article(Post): def __init__(self, id, title, content): super(Article, self).__init__(id, title) self.content = content class Link(Post): def __init__(self, id, title, url): super(Link, self).__init__(id, title) self.url = url def __str__(self): return '{} ({})'.format( super(Link, self).__str__(), self.url, ) article = Article(1, 'Hello, World!', 'This is my first article.') link = Link(2, 'DjangoTricks', 'https://djangotricks.blogspot.com') isinstance(article, Post) == True isinstance(link, Post) == True print(link)
Même chose dans JS:
class Article extends Post { constructor (id, title, content) { super(id, title); this.content = content; } } class Link extends Post { constructor (id, title, url) { super(id, title); this.url = url; } toString() { return super.toString() + ' (' + this.url + ')'; } } article = new Article(1, 'Hello, World!', 'This is my first article.'); link = new Link(2, 'DjangoTricks', 'https://djangotricks.blogspot.com'); article instanceof Post === true; link instanceof Post === true; console.log(link.toString());
Propriétés de classe: getters et setters.
Dans la programmation orientée objet, les classes ont des attributs, des méthodes et des propriétés. Les propriétés sont un mélange d'attributs et de méthodes. Vous pouvez traiter les propriétés comme des attributs, mais quelque part à l'intérieur, elles appellent des méthodes spéciales appelées getters / setters pour le traitement de données spécifiques.
Dans cet exemple, Python montre la manière de base de décrire le getter et le setter pour la propriété slug
aide de décorateurs:
class Post(object): def __init__(self, id, title): self.id = id self.title = title self._slug = '' @property def slug(self): return self._slug @slug.setter def slug(self, value): self._slug = value post = Post(1, 'Hello, World!') post.slug = 'hello-world' print(post.slug)
Dans JS, le getter et le setter de la propriété slug
peuvent être décrits comme suit:
class Post { constructor (id, title) { this.id = id; this.title = title; this._slug = ''; } set slug(value) { this._slug = value; } get slug() { return this._slug; } } post = new Post(1, 'Hello, World!'); post.slug = 'hello-world'; console.log(post.slug);
Conclusions
- Dans les deux langues, vous pouvez décrire les valeurs par défaut des arguments de fonction.
- Dans les deux langues, vous pouvez passer un nombre arbitraire d'arguments nommés ou positionnels à une fonction.
- Les deux langages prennent en charge un paradigme de programmation orienté objet.
Eh bien, et enfin, l'auteur de la publication originale propose d'acheter chez lui pdfku avec des feuilles de triche colorées pour python et javascript pour quinze dollars .
Imprimez et accrochez-vous au mur ou faites un avion en papier - c'est vous qui décidez!