Orienté objet et [Programmation orientée objet](http://e-words.jp/w/E382AAE38396E382B8E382A385AFE838890E8738890E8738890E8738890E8738890E87 C'est un concept essentiel. Toutes les données des programmes Python sont représentées sous forme d'objets ou de relations entre objets. Toutes les chaînes et listes décrites jusqu'à présent sont des objets.
Cependant, cette page ne fournit pas une explication «claire» et «précise» de l'orientation de l'objet. Par conséquent, même dans l'explication des chaînes et des listes, je n'ai pas osé expliquer la partie sur les objets (et les méthodes). Le reste de cet article explique comment utiliser les classes et les objets en Python, en supposant que vous compreniez l'orientation des objets.
Le programme qui utilise réellement la classe et l'objet est écrit ci-dessous. Veuillez l'exécuter et vérifier l'opération.
class_explain.py
class Spam:
val = 100
def ham(self):
self.egg('call method')
def egg(self,msg):
print("{0}".format(msg))
print(("{0}".format(self.val)))
spam = Spam()
spam.ham()
Le résultat est le suivant.
call method 100
En Python, les classes sont créées avec ** class ** * nom de classe ***: **. Les noms de classe commencent par des lettres majuscules. Les variables de classe et les fonctions intraclasses (= méthodes) sont définies à l'aide de l'inscription. Les objets sont créés avec * object * ** = ** * class () *. La méthode est appelée avec * object.method () *. Si vous expliquez le programme ci-dessus en japonais
Le point est le premier argument ** self ** de la méthode. Pour ceux qui sont entrés en Python à partir d'autres langues Vous pourriez vous demander, "Qu'est-ce que c'est que ce soi quand spam.ham () n'a pas d'arguments?" En Python, les méthodes ont au moins un argument. Il est d'usage de toujours nommer ce premier argument self. En utilisant self, vous pouvez obtenir les variables de l'objet lui-même et appeler la méthode. C'est "ceci" en Java.
Une fonction spéciale appelée lors de la création d'un objet s'appelle un constructeur.
L'initialisation des données manipulées par l'objet est effectuée ici.
Le constructeur est défini avec le nom «__init __ ()». Il y a deux " _
"avant et après. Faites attention.
constructor_explain.py
class Spam:
def __init__(self,ham,egg):
self.ham = ham
self.egg = egg
def output(self):
sum = self.ham + self.egg
print("{0}".format(sum))
spam = Spam(5,10)
spam.output()
Le résultat est le suivant.
15
À l'opposé du constructeur, cette fonction est automatiquement exécutée lorsque l'objet n'est plus nécessaire et que Python le supprime.
Définissez-le avec une méthode nommée __del__
. Mais dans la plupart des cas, aucun destructeur n'est défini. Comme raison
Nous utilisons avec pour libérer des ressources, mais nous ne l'expliquerons pas ici car cela dépasse le niveau.
"Héritage" définit une classe comme une classe avec des données et des méthodes d'une autre classe. L'héritage est une idée importante commune non seulement à Python, mais également aux langages de programmation orientés objet. Exécutez le programme suivant.
extend_explain.py
class Base:
basevalue = "base"
def spam(self):
print("Base.spam()")
def ham(self):
print("ham")
class Derived(Base):
def spam(self):
print ("Derived.spam()")
self.ham()
derived = Derived()
print("{0}".format(derived.basevalue))
derived.ham()
** class ** * Nom de classe (nom de classe de base) * **: ** vous permet de définir une classe (classe dérivée) qui hérite des variables et méthodes de la classe de base. La classe dérivée hérite des variables et des méthodes de la classe de base, donc la sortie ressemble à ceci:
base ham
Python permet à «l'héritage multiple» d'hériter de plusieurs classes de base. ** class ** * Nom de classe (nom de classe de base 1, nom de classe de base 2, ...) *
multi_extend.py
class A:
def method(self):
print("class A")
class B:
def method(self):
print("class B")
class C(A):
def method(self):
print("class C")
class D(B,C):
pass
d = D()
d.method()
Le résultat de sortie sera ** classe B **. Bien que rarement utilisé, vous pouvez créer une classe qui ne fait rien en écrivant pass dans la classe. Lorsque vous appelez la méthode method () de l'objet d de la classe D, vous pouvez utiliser les classes de base B et C de la classe D. La méthode de classe B method () décrite précédemment est appelée et la ** classe B ** est sortie. Si la classe B du programme ci-dessus est décrite uniquement pour passer comme dans la classe D, la méthode method () n'existe pas dans la classe de base B. La méthode de classe C method () est appelée et la sortie est ** classe C **. Si seul pass est décrit pour la classe C, la méthode method () de la classe A, qui est la classe de base de la classe C, sera appelée. ** la classe A ** est sortie. Si vous n'écrivez la classe A que pour pass, une exception se produira car method () n'existe dans aucune des classes.
La création d'un héritage multiple complexe peut entraîner une erreur car l'ordre de recherche des méthodes ne peut pas être déterminé. Faites attention.
Encapsulation est un élément important de la programmation orientée objet. En Python, vous pouvez rendre une variable ou une méthode privée en ajoutant «\ _ \ _» (deux _). Exécutez le programme suivant.
private_explain.py
class Spam:
__attr = 100
def __init__(self):
self.__attr = 999
def method(self):
self.__method()
def __method(self):
print(self.__attr)
spam =Spam()
spam.method() #OK
spam.__method() #NG
spam.__attr #NG
La ligne spam.method () fonctionne correctement, mais la ligne spam. \ _ \ _ Method () donne une erreur. La méthode méthode de la classe Spam est publique car elle ne commence pas par "\ _ \ _". Il peut être appelé directement depuis l'objet. J'appelle \ _ \ _method () avec "\ _ \ _" au début de la méthode méthode, Puisqu'il s'agit d'une référence de l'intérieur, aucune erreur ne se produira. Mais si l'objet spam tente d'appeler directement \ _ \ _method () \ _ \ _ La méthode () avec "\ _ \ _" au début ne peut pas être appelée car elle est privée, ce qui entraîne une erreur. Ceci s'applique également au spam. \ _ \ _ Attr.
Suivant: Cours de base Python (14 modules et packages)
Recommended Posts