[PYTHON] J'ai essayé de commencer avec Hy ・ Définir une classe

Cet article ressemble à Lisp, mais pour le moment Python Part 2 Advent Calendar 2015 est l'article du troisième jour.

Dans la continuité de Dernière fois, nous explorerons la possibilité de Hy.

Ancienne méthode de définition de classe

La version stable de Hy au moment de la rédaction de cet article est la 0.11.0.

Dans la version 0.11.0, lors de la définition d'une classe, utilisez def class et écrivez comme suit.

(defclass FooBar [object]
  [[--init--
    (fn [self x]
      (setv self.x x)
      None)]

   [get-x
    (fn [self]
      "Return our copy of x"
      self.x)]])

Comment définir une nouvelle classe

Dans la dernière version de développement de Hy, comme documenté, comment définir une classe C'est un peu étrange.

(defclass FooBar [object]
  (defn --init-- [self x]
    (setv self.x x))

  (defn get-x [self]
    "Return our copy of x"
    self.x))

Par rapport à la version 0.11.0 ou antérieure, le style d'écriture est plus propre.

Je ne sais pas quand la version qui peut être écrite sera stable, mais si elle change quand même, je m'habituerai à la nouvelle écriture, donc je suppose que je vais utiliser la version de développement de Hy installée à partir de github à partir de maintenant. écrire.

pip install git+https://github.com/hylang/hy.git

ʻSi name == Comment écrire '__ main __' `en Hy

Cela n'a rien à voir avec la définition de la classe, mais quand j'écris un script pour vérifier l'opération,

if __name__ == '__main__':
    #Faites quelque chose ici
    func()

Je veux écrire un idiome équivalent à dans Hy.

Apparemment, «X» de Python devient «--X -» en Hy, vous pouvez donc l'écrire comme suit.

; hello.hy
(defn hello []
  (print "Hello, World"))

(if (= --name-- "__main__")
  (hello))

Exécutez avec l'interpréteur «hy».

$ hy ~/tmp/hello.hy
Hello, World

Hériter de la classe

Quand j'ai pensé à l'exemple de la programmation orientée objet utilisant l'héritage de classe, je ne pouvais pas penser à un exemple utile, donc le chef-d'œuvre intemporel "Rudolph and Ippai Attena" J'ai fait un échantillon trivial basé sur dp / 4061335057 /).

Définissez la classe Cat qui représente un chat domestique et le StrayCat qui représente un chat errant en héritant de la classe abstraite ʻAbstractCat`.

; cat.hy
(defclass AbstractCat [object]
  (defn --init-- [self name]
    (setv self.name name))

  (defn greet [self]
    (raise NotImplementedError)))

(defclass StrayCat [AbstractCat]
  (defn greet [self]
    (.format "Mon nom est{}" self.name)))

(defclass Cat [AbstractCat]
  (defn --init-- [self name home]
    (.--init-- (super Cat self) name)
    (setv self.home home))

  (defn greet [self]
    (.format "mon nom est{}。{}J'habite à." self.name self.home)))

(defn main []
  (let [cat1 (Cat "Rudolph" "Maison de Rie-chan")
        cat2 (StrayCat "Ippai Attena")]
    (print (.greet cat1))
    (print (.greet cat2))))

(if (= --name-- "__main__")
  (main))

Simplement parce que «X» devient «--X -» donne l'impression que vous avez presque déplacé la syntaxe Python vers la syntaxe Lisp.

Le constructeur __init __ devient --init --, et utilise(setv self.key value)pour définir les propriétés.

(defclass AbstractCat [object]
  (defn --init-- [self name]
    (setv self.name name))

L'idiome Python super (X, self) .method () qui appelle la méthode de la classe parente est presque le même, juste remplacé par la syntaxe Lisp. Dans l'exemple ci-dessus, il est utilisé lors de l'appel du constructeur de la classe parent.

(defclass Cat [AbstractCat]
  (defn --init-- [self name home]
    (.--init-- (super Cat self) name)
    (setv self.home home))

Le modèle qui lève une exception NotImplementedError pour représenter une méthode abstraite peut être porté presque exactement comme (lever NotImplementedError).

(defclass AbstractCat [object]
  ;;Abréviation
  (defn greet [self]
    (raise NotImplementedError)))

Convertir le code Hy en code Python en utilisant hy2py

Hy est livré avec un outil de conversion Hy → Python appelé hy2py. Utilisons cet outil pour convertir l'exemple ci-dessus en code Python.

hy2py cat.hy

Le résultat est le suivant.

from hy.core.language import name


class AbstractCat(object):

    def __init__(self, name):
        self.name = name
        self.name
        return None

    def greet(self):
        raise NotImplementedError


class StrayCat(AbstractCat):

    def greet(self):
        return u'\u4ffa\u306e\u540d\u524d\u306f{}'.format(self.name)


class Cat(AbstractCat):

    def __init__(self, name, home):
        super(Cat, self).__init__(name)
        self.home = home
        self.home
        return None

    def greet(self):
        return u'\u50d5\u306e\u540d\u524d\u306f{}\u3002{}\u306b\u4f4f\u3093\u3067\u3044\u307e\u3059\u3002'.format(self.name, self.home)

def main():

    def _hy_anon_fn_6():
        cat1 = Cat(u'\u30eb\u30c9\u30eb\u30d5', u'\u308a\u3048\u3061\u3083\u3093\u306e\u5bb6')
        cat2 = StrayCat(u'\u30a4\u30c3\u30d1\u30a4\u30a2\u30c3\u30c6\u30ca')
        (cat1, cat2)
        print(cat1.greet())
        return print(cat2.greet())
    return _hy_anon_fn_6()
(main() if (__name__ == u'__main__') else None)

Il a été converti en code Python presque comme prévu, sauf qu'il contenait un "return None" sans signification.

finalement

Avec la dernière version de développement de Hy, vous pouvez définir des classes très intuitivement avec def class, donc cela ne vous semble pas trop difficile.

Peut-être parce que la grammaire de Python est simple, le code Python et le code Hy se ressemblent beaucoup, et vous vous rendez compte que «tous les langages de programmation mènent à Lisp».

La prochaine fois, j'aimerais écrire un programme plus large pour explorer les possibilités de Hy.

Recommended Posts

J'ai essayé de commencer avec Hy ・ Définir une classe
J'ai essayé de commencer avec Hy
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de démarrer avec le script python de blender_Part 01
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai écrit un script pour vous aider à démarrer avec AtCoder à grande vitesse!
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé d'obtenir des données CloudWatch avec Python
Zubu amateur veut démarrer Python
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
Lien pour commencer avec python
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Comment démarrer avec Scrapy
Comment démarrer avec Python
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment démarrer avec Django
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
Notes d'étape pour démarrer avec django
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé un langage fonctionnel avec Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai essayé de mettre en œuvre une blockchain qui fonctionne réellement avec environ 170 lignes
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai écrit un diagramme de configuration du système avec des diagrammes sur Docker
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'obtiens un UnicodeDecodeError en essayant de me connecter à oracle avec python sqlalchemy
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)