Maison  >  Article  >  développement back-end  >  À propos des classes et des méthodes dans la programmation orientée objet Python

À propos des classes et des méthodes dans la programmation orientée objet Python

高洛峰
高洛峰original
2017-03-01 13:33:381387parcourir

Classes et instances

Python est un langage orienté objet, et les concepts les plus importants de l'orientation objet sont les classes et les instances. Je les ai très bien compris quand je l'ai appris pour la première fois. Concept, jusqu'à ce que le professeur dise "les oiseaux d'une plume s'assemblent". >

Une classe consiste en fait à regrouper des choses ayant les mêmes caractéristiques dans une seule catégorie, par exemple, les humains

Nous avons défini. la classe humaine, mais l'humain a certaines caractéristiques, comme deux yeux et une bouche, nous les ajoutons dans
class Person(object):
  pass

J'ai déjà écrit quelques informations sur la personne, mais la personne a toujours un nom, comme moi le vison. Eh bien, je ne peux pas me maltraiter, je dois les mettre dans Ajoutez-le dans
class Person(object):
  eyes = 2
  mouth = 1

C'est tellement parfait, une personne l'a finalement terminé. Cela a pris un jour à Dieu et cela ne m'a pris qu'une minute (je plaisante), nous avons lu l'information. Les humains ont deux yeux, une bouche, et leur nom est vison. . - - ! Quelque chose ne va pas, mon nom est vison ~ Pourquoi les humains sont-ils appelés vison ?
class Person(object):
  eyes = 2
  mouth = 1
  name = mink
vison est le nom des humains, le nom des humains Mink est évidemment faux, "wo" devrait être un individu humain, un seul exemple.


Maintenant, j'ai enfin mon propre nom à la place Pour que tout le monde puisse la partager, cette méthode s'appelle instance mais j'ai une compétence que les autres ne connaissent pas , je ne suis pas affecté par la gravité.
class Person(object):
  eyes = 2
  mouth = 1
  
  def __init__(self, name):
    self.name = name 

me = Person('mink')

class Person(object):
  eyes = 2
  mouth = 1

  def __init__(self, name)
    self.name = name 

  def jineng(self, txt):
    print "%s %s" % (self.name, txt)

me = Person('mink')
me.jineng("我不受重力影响, 我会飞")
Méthode de classe et méthodes statiques

Vous pouvez souvent voir @classmethod et @staticmethod en python, appelées méthodes de classe et méthodes d'instance.


Création d'une classe animale, génération d'une instance de chat et impression du nom et l'âge du chat. On voit que les attributs de la classe Animal sont renvoyés, c'est-à-dire que l'instance accède à l'attribut
class Animal(object):
  name = 'lili'
  age = 1

cat = Animal()
print cat.name, cat.age   # print 'lili' 1
de la classe

C'est-à-dire que cette méthode ajoutée par défaut est une méthode d'instance. La méthode d'instance modifie les attributs de l'instance, tandis que les attributs de la classe ne changent pas

# 显示内容是一样的
print cat.name, cat.age
print Animal.name, Animal.age
给Animal类添加一个方法(函数)

class Animal(object):
  name = 'lili'
  age = 1

  def edit(self, name, age):
    self.name = name
    self.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # print 'rol' 2
print Animal.name, Animal.age  # print 'lili' 1

Explication selon laquelle les méthodes d'instance ne peuvent pas modifier les attributs de la classe, mais que dois-je faire si je souhaite modifier les attributs de la classe

# 我们修改一下这个函数
def edit(self, name, age):
  name = name
  self.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # pirnt 'rol' 2
print Animal.name, cat.age   # print 'lili' 1

Ce qu'il faut noter ici, c'est que le premier paramètre de la fonction d'édition passe de self à cls. En python, il est recommandé d'utiliser cls dans la méthode de classe et le paramètre de. la méthode d'instance est self, et il est expliqué ici que l'instance peut être utilisée Méthode de classe (fonction)

Ensuite j'ajoute une méthode init à cette classe pour initialiser les attributs
# 再一次修改edit
@classmethod
def edit(cls, name, age):
  cls.name = name
  cls.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # print 'rol' 2
print Animal.name, Animal.age  # print 'rol' 2


Après avoir ajouté __init__, cat n'utilise pas ensuite les attributs de la classe, et modifie la méthode d'édition sans changer les attributs de l'instance cat

class Animal(object):
  name = 'lili'
  age = 1

  def __init__(self, name, age):
    self.name = name
    self.age = age
  ...

cat = Animal('kuku', 4)
cat.edit('rol', 2)

print cat.name, cat.age     # print 'kuku' 4
print Animal.name, Animal.age  # print 'rol' 2

<.>

Cela montre que la méthode statique ne peut pas utiliser les attributs et les méthodes de l'instance, bien sûr, vous ne pouvez pas utiliser les classes. Ensuite, l'inverse

# 添加staticmethod
@staticmethod
def say_name(name=None):
  if not name:
    name = self.name
  print &#39;my name is %s.&#39; % name

cat = Animal(&#39;kaka&#39;, 3)
cat.say_name()        
# 运行的话会报 NameError: global name &#39;self&#39; is not defined  
# 那是不是没给他添加self字段, 所以没找到
def say_name(self, name=None):
  ...

cat.say_name()
# TypeError: say_name() takes at least 1 argument(0 given), 显示缺少参数

<.>

la méthode statique est accessible via les méthodes de classe et les méthodes d'instance.

Pour résumer :

# 我们修改一下代码
# 先创建一个实例的方法, 他使用类的staticmethod

@staticmethod
def say_name(name):
  print &#39;my name is %s.&#39; % name

def say(self):
  self.say_name(self.name)
  
@classmethod
def _say(cls):
  cls.say_name(cls.name)

cat = Animal(&#39;kaka&#39;, 3)
cat.say()
cat._say()
Méthode statique (staticmethod)

La méthode statique ne peut pas utiliser la attributs et méthodes de l'instance


La méthode statique ne peut pas utiliser les attributs et les méthodes de la classe
Méthode statique Peut être appelée via une classe ou une instance

La méthode statique est équivalente à une fonction globale limitée à la classe

Méthode de classe (classmethod)

La méthode de classe peut utiliser les attributs et les méthodes de la classe

Les méthodes de classe peuvent utiliser des méthodes statiques

Les méthodes de classe peuvent être appelées via des classes ou des instances

En savoir plus sur la programmation orientée objet Python Pour les articles liés aux classes et aux méthodes, veuillez prêter 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