Premiers pas avec Python pour les classes PHPer

Ceci est une suite de Fonctions. Cette fois, je vais expliquer la classe!

Définition de classe

Tout d'abord, comparons les méthodes de description de base. Ce n'est pas si différent de Gatsuri, donc je pense que vous pouvez le lire facilement. Cependant, il existe de nombreuses différences. ..

Code PHP

<?php

class Hoge {
    static private $defaultValue = 'hogehoge';
    private $value = null;

    public function __construct($value=null) {
        if ($value) {
            $this->value = $value;  
        } else {
            $this->value = self::$defaultValue;
        }
    }

    public function getValue() {
        return $this->value;
    }
}

$hoge = new Hoge();
echo $hoge->getValue();

Code Python

# coding=utf8

class Hoge(object):
    default_value = 'hogehoge'

    def __init__(self, value=None):
        if value:
            self.value = value
        else:
            self.value = self.default_value

    def get_value(self):
        return self.value

hoge = Hoge()
print(hoge.get_value())

Comment écrire

La définition de classe se fait en utilisant class comme en PHP. Comme les instructions «if» et «function», la représentation de la portée est représentée par «indent» au lieu de «{}». Encore une fois, n'oubliez pas le «: (deux-points)» à la fin de la définition de classe.

Héritez de la classe d'objets!

Lors de la création d'une classe simple, assurez-vous d'hériter de la «classe d'objet». Vous pouvez le créer sans en hériter, mais il y a de nombreux avantages à en hériter. Si vous voulez en savoir plus, veuillez vous référer à ici.

Les classes Python n'ont pas de modificateurs d'accès!

C'est l'un des endroits où vous pouvez facilement faire la différence en comparant les sources. Il n'y a pas de «modificateur d'accès» tel que «public» en Python, et fondamentalement tout est traité comme «public». Pour le moment, si vous ajoutez «__» avant le nom de la variable ou de la méthode d'instance, vous ne pourrez pas y accéder.

constructeur

Inutile de dire que le «nom de la méthode constructeur» est différent. PHP est «__construct» et Python est «__init __».

Quel est l'argument de la méthode self? ..

** C'est l'une des parties appelées "Python Kimoi !!!" **. .. Ce «soi» est une «référence à lui-même (votre propre instance)». Il est trop compliqué d'expliquer pourquoi une telle chose est faite, alors s'il vous plaît google chacun. ..

L'important ici est que ** le premier argument de la méthode passe toujours une référence à lui-même **.

Soyez prudent avec les définitions des variables d'instance et de classe!

Dans le cas de PHP, la définition est divisée en utilisant le qualificateur statique, mais dans le cas de Python, la définition de la ʻinstance variable doit être faite dans la méthode telle que __init__. Toutes les variables définies en dehors de la «méthode» sont des «variables de classe». Si vous exécutez l'exemple ci-dessous, Hoge.hoge sera affiché, mais vous pouvez voir que Hoge.piyo provoque une erreur.

# coding=utf8

class Hoge(object):
    hoge = 'hoge'  #Variable de classe

    def __init__(self):
        self.piyo = 'piyo'  #Variable d'instance

print(Hoge.hoge)

#Inaccessible car la variable d'instance n'est pas instanciée
print(Hoge.piyo)

Veuillez noter qu'il est facile d'oublier (oublier). ..

Référence aux variables / méthodes d'instance

Ceci est également explicite, mais en PHP c'est «$ this-> value» et en Python c'est «self.value». Il y a aussi une différence entre l '«opérateur de flèche» et «l'opérateur de point», donc soyez prudent.

En ce qui concerne les «variables de classe» et les «méthodes statiques», en PHP, il est écrit comme «sefl :: $ hoge», mais Python est accessible avec «self.hoge» comme les variables d'instance.

Héritage de classe

Parlons de l'héritage de classe. Comme toujours, commencez par l'exemple de code.

Code PHP

<?php

class BaseClass {
    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return$this->value;
    }
}

class SubClass extends BaseClass {
    public function __construct($value) {
        $value = $value * 2;
        parent::__construct($value);
    }
}

$hoge = new SubClass(10);
echo $hoge->getValue();

Code Python

# coding=utf8

class BaseClass(object):
    def __init__(self, value):
        self.value = value

    def get_value(self):
        return self.value

class SubClass(BaseClass):
    def __init__(self, value):
        value = value * 2
        super(SubClass, self).__init__(value)

hoge = SubClass(10)
print(hoge.get_value())

Description de l'héritage

Je l'ai déjà fait dans l'explication de la définition de classe, mais je vais l'expliquer à nouveau. Pour hériter d'une classe en Python, écrivez simplement le nom de la classe dont vous voulez hériter dans () après le nom de la classe.

class SubClass(BaseClass):

Appeler une méthode de la classe parent

En Python, utilisez la super fonction pour accéder à la classe parent. Dans l'exemple, la méthode (constructeur) de la classe parent est appelée dans le constructeur, mais vous pouvez l'appeler de la même manière avec une méthode normale.

super(SubClass, self).__init__(value)

Une fois démonté, il ressemble à ce qui suit.

super(Propre classe,Propre instance).Fonction que vous souhaitez appeler(argument)

Héritage multiple de classes

Comment Python prend en charge l'héritage multiple de classes! C'est un héritage multiple pratique, mais il a tendance à être compliqué, alors utilisez-le avec prudence.

Comment écrire l'héritage multiple

Identique à la description d'héritage normale. La classe dont vous voulez hériter est décrite dans (), mais s'il y a plusieurs classes, séparez-les simplement par , (virgule).

class SubClass(HogeClass, PiyoClass):

L'ordre dans lequel les constructeurs sont appelés

** Faites attention car c'est déroutant ici! ** ** Tout d'abord, un exemple de code.

# coding=utf8

class A(object):
    def __init__(self):
        super(A, self).__init__()
        print('A')

class B(object):
    def __init__(self):
        super(B, self).__init__()
        print('B')

class C(A, B):
    def __init__(self):
        super(C, self).__init__()
        print('C')

instance = C()

Il existe une «classe C» qui hérite de deux de la «classe A» et de la «classe B». Si vous faites cela, vous obtiendrez le résultat suivant.

B
A
C

Si vous regardez le résultat, vous pouvez voir qu'ils sont appelés dans l'ordre B-> A-> C.

Pourquoi la super fonction est-elle écrite dans la classe parent?

J'ai expliqué plus tôt que la «super fonction» est pour accéder à la classe parent, mais à proprement parler, c'est pour accéder à la «classe parent ou sœur». Puisque les classes parentes de la «classe C», de la «classe A» et de la «classe B», ont une relation fraternelle, la «super fonction» est nécessaire.

Peut-être que cette explication n'est pas encore tout à fait correcte, alors jetez un œil à la suivante!

Pourquoi l'ordre B-> A-> C?

La définition de classe C est la classe C (A, B):, et ʻA classeest déclarée en premier. Dans ce cas, le parent immédiat de «C class» est traité comme «A class». En d'autres termes,super ()dansC class pointe vers ʻA class.

Ensuite, si vous regardez ʻA classe, il y a classe Bdans la relation des frères. Lasuper fonction est aussi pour accéder aux classes frères, donc super () ʻin ʻA class pointera vers classe B`.

Le reste est «classe B», mais il n'y a pas de parent dans «classe B». Il existe une «classe» comme relation fraternelle, mais comme Python est intelligent, il ignorera la relation que vous avez tracée une fois. Il n'y a donc rien sur lequel pointe super () de la classe B`.

En conséquence, l'ordre est «B-> A-> C». C'est un peu déroutant, mais l'avez-vous compris?

Classe Mixin

Est-ce proche de «trait» en PHP? ** Si vous pensez "Un nouveau sort ..." **, ne vous inquiétez pas. Ceci est juste une histoire d '«héritage multiple».

Tout d'abord, un échantillon.

# coding=utf8

class Mixin(object):
    def say(self):
        print('Hoge!!!!!')

class Human(Mixin, object):
    pass  #pass signifie "ne rien faire".

class Cat(Mixin, object):
    pass

human = Human()
human.say()

cat = Cat()
cat.say()

La «classe humaine» et la «classe Cat» héritent respectivement de la «classe objet et de la classe Mixin». C'est vraiment juste un «héritage multiple», mais la raison pour laquelle je donne différents titres et raconte à nouveau la même histoire est ** parce qu'il est facile d'ajouter des fonctions à plusieurs classes **. Le «trait» de PHP était également un mécanisme permettant d'ajouter facilement des fonctions à plusieurs classes. La même chose peut être exprimée en utilisant «l'héritage multiple» en Python.

La plupart des utilisations de «l'héritage multiple» en Python sont la «classe Mixin». Je pense qu'il sera utilisé dans Django, alors souvenez-vous-en!

Au fait, dans cet exemple, la classe Mixin est une sous-classe de la classe objet, donc la classe humaine et la classe Cat peuvent être définies comme suit.

class Human(Mixin):
    pass  #pass signifie "ne rien faire".

class Cat(Mixin):
    pass

C'est juste une histoire d'héritage. ..

Résumé

Cette fois, j'ai présenté comment créer une classe et en hériter. Cela semble compliqué car il y a beaucoup de choses à faire, mais c'est très pratique et amusant à maîtriser!

Que dois-je faire ensuite? Il est indécis. ..

Recommended Posts

Premiers pas avec Python pour les classes PHPer
Premiers pas avec Python pour les fonctions PHPer
1.1 Premiers pas avec Python
Premiers pas avec Python
Premiers pas avec Python
Premiers pas avec Python pour PHPer-Super Basics
Introduction aux fonctions Python
Premiers pas avec Python Django (1)
Premiers pas avec Python Django (4)
Premiers pas avec Python Django (3)
Introduction à Python Django (6)
Premiers pas avec Python Django (5)
[Français] Premiers pas avec Rust pour les programmeurs Python
Paramètres pour démarrer avec MongoDB avec python
Premiers pas avec Python responder v2
Premiers pas avec les applications Web Python
Premiers pas avec Julia pour Pythonista
Premiers pas avec Python Bases de Python
Premiers pas avec Google App Engine pour Python et PHP
Premiers pas avec les algorithmes génétiques Python
Premiers pas avec Python 3.8 sous Windows
Premiers pas avec python3 # 1 Apprenez les connaissances de base
Premiers pas avec Python Web Scraping Practice
Premiers pas avec Python Web Scraping Practice
Premiers pas avec Dynamo de Python boto
Premiers pas avec Lisp pour Pythonista: Supplément
Django 1.11 a démarré avec Python3.6
Premiers pas avec Android!
Premiers pas avec apache2
Premiers pas avec Django 1
Introduction à l'optimisation
Premiers pas avec Numpy
Premiers pas avec Spark
Premiers pas avec Pydantic
Premiers pas avec Jython
Premiers pas avec Django 2
Création d'un environnement Windows 7 pour une introduction à l'apprentissage automatique avec Python
Démarrer avec Python avec 100 coups sur le traitement du langage
Premiers pas avec AWS IoT facilement en Python
Matériel à lire lors de la mise en route de Python
Traduire Premiers pas avec TensorFlow
Introduction à Tkinter 2: Button
Premiers pas avec Go Assembly
Premiers pas avec PKI avec Golang ―― 4
Commencez avec Python! ~ ② Grammaire ~
Premiers pas avec Django avec PyCharm
Premiers pas avec python3 # 2 En savoir plus sur les types et les variables
Commencez avec Python! ~ ① Construction de l'environnement ~
Premiers pas avec python3 # 3 Essayez des calculs avancés à l'aide de l'instruction d'importation
Introduction à Git (1) Stockage d'historique
Premiers pas avec Sphinx. Générer docstring avec Sphinx
Premiers pas avec Sparse Matrix avec scipy.sparse
Comment démarrer avec Python
Initiation aux mathématiques Démarrage avec la programmation Python Challenge Notes personnelles - Problème 1-1
Premiers pas avec Cisco Spark REST-API
a commencé python