Maison  >  Article  >  développement back-end  >  Explication détaillée des classes et des types en python

Explication détaillée des classes et des types en python

高洛峰
高洛峰original
2017-03-07 16:41:521435parcourir

Qu'est-ce qu'une classe ?

peut être considérée comme un synonyme de catégorie ou de type. Tous les objets appartiennent à une certaine classe et sont appelés instances de cette classe.

Par exemple : Bird est une instance de "bird". Ceci est juste une classe générale (abstraite) avec de nombreuses sous-classes : l'oiseau que vous voyez pourrait appartenir à la sous-classe « alouette ». Considérez les « oiseaux » comme l’ensemble de tous les oiseaux, dont les « alouettes » sont un sous-ensemble. Lorsque la classe à laquelle appartient un objet est un sous-ensemble de la classe à laquelle appartient un autre objet, la première est appelée une sous-classe du second, donc les « alouettes » sont des sous-classes d'« oiseaux » et les « oiseaux » sont des « alouettes ». Superclasse "Bird"

Définir une sous-classe n'est qu'un processus de définition de plus de méthodes

Créer une classe

>>> class Person:
    def setName(self,name):
        self.name=name
    def getName(self):
        return self.name
    def greet(self):
        print "Hello,world! I'm %s" % self.name

        
>>> foo=Person()
>>> bar=Person()
>>> foo.setName('Nsds')
>>> bar.setName('Ysdy')
>>> foo.greet()
Hello,world! I'm Nsds
>>> bar.greet()
Hello,world! I'm Ysdy

Lors de l'appel des fonctions setName et greet de foo, foo se transmet automatiquement dans la fonction comme premier paramètre, il est donc nommé self. Sans self, les méthodes membres ne peuvent pas accéder à l'objet lui-même sur lequel elles souhaitent exploiter ses propriétés.

Les propriétés sont accessibles en externe :

>>> foo.name
'Nsds'
>>> bar.name='Yoda'
>>> bar.greet()
Hello,world! I'm Yoda

<.> Caractéristiques, fonctions, méthodes

Le paramètre self est en fait la différence entre les méthodes et les fonctions. Les méthodes lient leur premier paramètre à l’instance correspondante, ce paramètre n’a donc pas besoin d’être fourni. Vous pouvez donc lier les propriétés à une fonction normale, donc il n'y aura pas de paramètres personnels spéciaux :

(Les caractéristiques sont des variables à l'intérieur de l'objet, l'état de l'objet est décrit par ses propriétés et les méthodes de l'objet. les caractéristiques peuvent être modifiées et les caractéristiques sont accessibles directement depuis l'extérieur de l'objet)

>>> class Class:
    def method(self):
        print &#39;I have a self!&#39;

        
>>> def function():
    print "I don&#39;t..."

>>> s=Class()
>>> s.method()
I have a self!
>>> s.method=function
>>> s.method()
I don&#39;t...

La variable bird.sing fait référence à la méthode de liaison bird.sing, ou au paramètre self Access (toujours lié à la même instance de la classe)

>>> class Bird:
    song=&#39;Squaawk&#39;
    def sing(self):
        print self.song

        
>>> bird=Bird()
>>> bird.sing()
Squaawk
>>> birdsong=bird.sing
>>> birdsong()
Squaawk

Placez un double trait de soulignement avant le nom pour créer la méthode ou l'attribut private (Non accessible de l'extérieur)

>>> class Secretive:
    def __inaccessible(self):
        print "Bet you can&#39;t see me..."
    def accessible(self):
        print "The secret message is:"
        self.__inaccessible()

        
>>> s=Secretive()
>>> s.__inacessible()

Traceback (most recent call last):
  File "<pyshell#182>", line 1, in <module>
    s.__inacessible()
AttributeError: &#39;Secretive&#39; object has no attribute &#39;__inacessible&#39;
>>> s.accessible()
The secret message is:
Bet you can&#39;t see me...

Dans la définition interne d'une classe, tous les noms commençant par un double trait de soulignement sont "traduits" pour être précédé d'un trait de soulignement unique et de la forme du nom de la classe

>>> Secretive._Secretive__inaccessible<unbound method Secretive.__inaccessible>
>>> s._Secretive__inaccessible()
Bet you can&#39;t see me...

L'espace de noms de la classe

Lors de la définition d'une classe, tout le code situé dans l'instruction de classe Exécuté dans un espace de noms spécial --- l'espace de noms de la classe. Cet espace de noms est accessible à tous les membres de la classe. La définition de la classe

est en fait le bloc de code d'exécution

>>> class MemberCounter:
    members=0
    def init(self):
        MemberCounter.members+=1

        
>>> m1=MemberCounter()
>>> m1.init()
>>> m1.members
>>> m1.members=2
>>> m1.members
>>> m2=MemberCounter()
>>> m2.init()
>>> m2.members
>>> m2.init()
>>> m2.members
>>> m1.members
>>>

La nouvelle valeur des membres est écrite dans les caractéristiques de m1 , protégeant les variables dans la portée de la classe

superclasse

>>> class Filter:
    def init(self):
        self.blocked=[]
    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]

    
>>> class SPAMFilter(Filter):
    def init(self):
        self.blocked=[&#39;SPAM&#39;]

        
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=SPAMFilter()
>>> s.init()
>>> s.filter([&#39;SPAM&#39;,&#39;SPAM&#39;,&#39;egg&#39;,&#39;name&#39;,&#39;ff&#39;])
[&#39;egg&#39;, &#39;name&#39;, &#39;ff&#39;]

héritage, superclasse

>>> class Filter:
    def init(self):
        self.blockes=[]
    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]

    
>>> class S(Filter):
    def init(self):
        self.blocked=[&#39;s&#39;]

        
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])

Plusieurs super classes

Les méthodes de la classe héritée en premier remplaceront les méthodes de la classe héritée plus tard

>>> class C():
    def calculate(self,expression):
        self.value=eval(expression)

        
>>> class Talker():
    def talk(self):
        print 'Hi,my value is',self.value

        
>>> class TalkingCalculator(C,Talker):
    pass

>>> tc=TalkingCalculator()
>>> tc.calculate('1+2*3')
>>> tc.talk()
Hi,my value is 7

Pour des articles plus détaillés sur les classes et les types en python, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn