[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.

Une histoire où j'étais accro à un projet utilisant la série Python 3.

Supposons que vous ayez une classe comme celle-ci


import threading


class ThreadRunner(object):
    def __init__(self):
        self.__thread = None
        self.__event = threading.Event()

    def start(self):
        self.__event.clear()
        self.__thread = threading.Thread(self.__run)

    def stop(self):
        self.__event.set()
        self.__thread.join()
        self.__thread = None

    def is_running(self):
        return not self.__event.is_set()

    def __run(self):
        raise NotImplementedError("class is abstract.")

C'est un utilitaire très simple qui combine Thread () et Event () pour le threading. Demandez à la classe enfant de remplacer __run () La partie traitement n'a pas été mise en œuvre pour pouvoir être utilisée correctement.

J'en ai hérité et j'ai essayé de le déplacer.

import time
from .ThreadRunner import ThreadRunner


class TimeWaiter(ThreadRunner):
    def __init__(self):
        super().__init__()

    def __run(self):
        while True:
            #Certains traitements
            time.sleep(1)

↑ Hériter comme ça,

from TimeWaiter import TimeWaiter

waiter = TimeWaiter()
waiter.start()

Maintenant.

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:\test\ThreadRunner.py", line 23, in __run
    raise NotImplementedError("class is abstract.")
NotImplementedError: class is abstract.

Je crache une erreur. Il aurait dû être remplacé et désactivé Le processus de lancement de NotImplementedError () de la méthode parent est appelé.

Les fonctions / variables avec deux traits de soulignement au début semblent être un peu spéciales

Lorsque j'ai recherché des informations à une extrémité, je suis arrivé à l'article suivant.

[Note] À propos du rôle du trait de soulignement "_" en Python http://qiita.com/ikki8412/items/ab482690170a3eac8c76

À propos de l'attribution de noms aux variables et méthodes Python (trait de soulignement) https://teratail.com/questions/41277

Dans la section commentaires du premier article et la réponse du deuxième article, il y avait une réponse à ce que j'étais de la mousse. Si vous ajoutez deux traits de soulignement au début du nom de la fonction ou du nom de la variable, Le nom changera automatiquement à l'intérieur (il semble s'appeler Mangled), et ce sera différent.

class ThreadRunner(object):
    def __init__(self):
        self.__thread = None
        self.__event = threading.Event()

    def start(self):
        self.__event.clear()
        self.__thread = threading.Thread(self.__run)

    def stop(self):
        self.__event.set()
        self.__thread.join()
        self.__thread = None

    def is_running(self):
        return not self.__event.is_set()

    def __run(self):
        raise NotImplementedError("class is abstract.")

La classe ThreadRunner mentionnée précédemment est synonyme de ce qui suit.


class TimeWaiter(object):
    def __init__(self):
        self.__thread = None
        self.__event = threading.Event()

    def start(self):
        self.__event.clear()
        self.__thread = threading.Thread(self.ThreadRunner__run)

    def stop(self):
        self.__event.set()
        self.__thread.join()
        self.__thread = None

    def is_running(self):
        return not self.__event.is_set()

    def ThreadRunner__run(self):
        raise NotImplementedError("class is abstract.")

    def TimeWaiter__run(self):
        while True:
            #Certains traitements
            time.sleep(1)

Peu importe combien la classe enfant hérite, le nom changera du côté de la classe parent. Ce n'était pas censé être annulé.

Dans ce cas, il semblait préférable d'avoir un underbar. En faisant un underbar, le mangling ne fonctionnera pas, Il sera traité comme un remplacement en interne.

Pour ceux qui connaissent Python, c'est naturel ... Je viens de commencer à le toucher, donc j'y étais assez accro et j'ai fait fondre mon temps ...

C'est tout pour le mémorandum.

Recommended Posts

[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Une histoire sur la tentative d'implémentation de variables privées en Python.
Une histoire déroutante avec deux façons d'implémenter XGBoost en Python + notes générales
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Une histoire sur la façon de spécifier un chemin relatif en python.
Comment utiliser la méthode __call__ dans la classe Python
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
[Django] Une histoire sur le fait de rester coincé dans un marais en essayant de valider un zip avec un formulaire [TDD]
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Une histoire sur la tentative d'exécuter plusieurs versions de Python (édition Mac)
Essayer de gérer SQLite3 avec Python [Note]
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Analyse de données en Python: une note sur line_profiler
[Note] Une histoire sur l'impossibilité de percer le proxy avec pip
[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio
Comment convertir / restaurer une chaîne avec [] en python
L'histoire de la création d'une partition de type Hanon avec Python
Je veux travailler avec un robot en python.
Choses à noter lors de l'initialisation d'une liste en Python
[Python] Création d'une méthode pour convertir la base en 1 seconde
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Je suis resté bloqué en essayant de spécifier un chemin relatif avec relative_to () en python
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
Comment utiliser le multitraitement python (suite 3) apply_async en classe avec Pool en tant que membre
Une note sur l'utilisation de l'API Facebook avec le SDK Python
J'ai créé un package pour filtrer les séries chronologiques avec python
Une histoire de compétition avec un ami dans Othello AI Preparation
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai essayé "Comment obtenir une méthode décorée en Python"
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur la façon de traiter le problème CORS
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
Comment remplacer une méthode de type défini par l'utilisateur générée par python swig
Une note sur [python] __debug__
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Une histoire sur tout, de la collecte de données au développement d'IA et à la publication d'applications Web en Python (3. développement d'IA)
Notez ce que vous avez fait pour utiliser Flycheck avec Python
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
Une histoire d'essayer d'automatiser un chot lorsque vous cuisinez vous-même
Une histoire sur le développement d'un type logiciel avec Firestore + Python + OpenAPI + Typescript
Python: une note sur les classes 1 "Résumé"
Remarque à propos de get_scorer de sklearn
[Python] Hériter d'une classe avec des variables de classe
Une note sur mock (bibliothèque fictive Python)
Une histoire d'essayer d'améliorer le processus de test d'un système vieux de 20 ans écrit en C
Une histoire d'essayer d'exécuter JavaScripthon sur Windows et d'abandonner.
[Petite histoire] Comment enregistrer des graphiques matplotlib dans un lot avec Jupyter
Remarque: [Python3] Convertissez datetime en chaîne dans le format de votre choix
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
Notez que le serveur d'exécution de Django est moss en Python 2.7.11 fourni avec Homebrew