Skip to main content

Premièrement, la métaclass

L'anglais de métaclass est un genre, à la fois un concept ou un mot-clé à Python. Même si cela le comprend, il n'y a pas d'impact sur celui-ci. Nous ne pouvons pas être empêtrés, pensant que c'est le sens de la classe. Dans cette méthode, nous soutient pour identifier une classe, ce qui en fait un type d'une certaine couche derrière.


Lorsque vous utilisez des classes dynamiques, nous transférons le nom de la classe et les propriétés de tuple et d'attributs de la couche parent. En utilisant la métaclasse, la différence de base n'est pas grande, mais l'expression est distinguée. Prenons un exemple:
Dans cet exemple, nous avons d'abord créé une classe appelée AddInfo, qui est une catégorie que nous avons identifiée. Parce que nous voulons atteindre la fonction de classification à travers elle, nous devons hériter du type de type class AddInfo(type): def __new__(cls, name, bases, attr): attr['info'] = 'add by metaclass' return super().__new__(cls, name, bases, attr) class Test(metaclass=AddInfo): pass. Dans l'article précédent, nous avons dit dans des objets orientés objet à Python, toutes les sources de base de tousClasse est de type. Cela signifie que chaque classe dans Python est un exemple de type.

Nous avons surchargé la méthode __New____ dans cette classe et nous avons passé quatre paramètres dans la méthode __New____. Le petit partenaire de l'œil doit l'avoir vu, Quatre paramètres de cette fonction sont les paramètres que nous passons lorsque nous appelons le type de type

. En fait, lorsque nous appelons la méthode de type pour créer une classe, c'est la fonction de __New__ cette fonction, la logique correspond à deux manières identiques.

Nous avons créé une nouvelle classe appelée test, aucune logique, passe directement. Cependant, nous spécifions un paramètre métaclass = addInfo lors de la création de classes, ici Ce paramètre est en fait spécifié de classe

, qui consiste à spécifier la logique de création de cette classe. Bien que nous écritions des cours dans le code, cette couche est créée par la métaclasse en tant que classe lorsqu'elle est déployée.

Selon la logique ci-dessus, nous pouvons savoir que la classe de test est prise.Soutenez les informations d'attribut de la classe lors de la création. Nous pouvons vérifier:

Lundi, la fonction étendue

ci-dessus est l'utilisation de base des catalogues, en type essentiel et nous sommes une classe dynamique, le type dynamique introduit était la même chose, mais l'affichage la forme était différente. Ensuite, il y a une question à poser, nous utilisons la classe Yuan que vous pouvez faire?


Il y a un exemple classique, nous savons tous que la liste d'origine de Python n'est pas "plus". Supposons que nous soyons utilisés pour utiliser la liste en Java, l'habitude est ajoutée pour y ajouter des éléments. Nous voulons créer une nouvelle classe dans cette nouvelle classe, nous pouvons ajouter une fonction à ajouter. Ceci est facile à utiliser via le catalogue.

Tout d'abord, nous devons identifier une couche appelée listeMeta, nous ajoutons un attribut à la classe de cette catégorie nommée Ajouter. Il est uniquement emballé,

La couche inférieure est obtenue grâce à la méthode de l'annexe

s'il vous plaît essayezTest:


Peu importe les résultats, nous avons inséré avec succès l'élément en appelant la méthode à la liste. Il y a un petit détail ici et nous ajoutons un attribut appelé "Ajouter" à Atea à Listmeta.

Cette propriété est ajoutée
ajoutée à la classe et non un exemple initialisé. Donc, si nous imprimons tous les attributs de la liste MYL, vous pouvez également voir l'existence de AdDe. class ListMeta(type): def __new__(cls, name, bases, attrs): # 在类属性当中添加了add函数 # 通过匿名函数映射到append函数上 attrs['add'] = lambda self, value: self.append(value) return super().__new__(cls, name, bases, attrs) class MyList(list, metaclass=ListMeta): pass

Si nous vivons directement pour accéder à des méthodes supplémentaires via une liste myList, cela entraînera des erreurs, car nous effectuons des méthodes de fonctions logiques anciennes limite la nécessité de transmettre en deux paramètres

. Le premier paramètre est un auto-objet et le deuxième paramètre est la valeur d'élément ajoutée. Si nous avons subi des attributs de classe de MyList pour activer des erreurs en raison du manque de paramètres. Parce que le cas de la classe dans la classe est également appelé et Python ajoute automatiquement un paramètre auto-ajouté au paramètre, chOui besoin de répondre aux exigences.

Nous comprenons que nous ne résolvons que le problème du problème, nous comprenons que METACCO peut atteindre une telle activité, mais cela ne vit pas pourquoi nous devons utiliser la catégorie? Il suffit de prendre l'exemple maintenant, nous pouvons hériter de la liste de liste, puis grandir notre chemin, pourquoi devez-vous utiliser un catalogue?

En ce qui concerne cette scène, nous ne pouvons trouver aucune raison. Il n'y a aucune raison de ne pas utiliser l'héritage sans utiliser de métamorphose. Cependant, dans certaines scènes et certains problèmes, nous devons utiliser le catalogue pour utiliser le catalogue. Juste Lorsque l'attribut de la classe change et crée la classe

, voir l'exemple suivant.

Troisièmement, la création de contrôle


, je me souviens toujours de moi les exemples des designs de l'usine introduits par le dernier article? C'est-à-dire que nous pouvons obtenir différents types de versions des paramètres. NousOH a créé trois types de jeux et une classe d'usine, nous avons surchargé la fonction __New____ de la classe d'usine. Nous permet de renvoyer différentes versions basées sur les paramètres intégrés dans l'initialisation.

En supposant que ce besoin soit complètement lisse, mais après avoir couru pendant un certain temps, nous avons découvert que le aval ne sera pas créé pour être paresseux. Par exemple

, mais directement aux besoins des choses nécessaires. Ce n'était pas un problème, mais le produit souhaite maintenant ajouter des points enfouis dans la classe d'usine et les statistiques pour visiter la visite de notre usine. Par conséquent, nous avons besoin de
pour limiter ces couches de jeu qui ne peuvent pas être initialisées directement et que l'affaire doit être renvoyée à travers l'usine


Comment réalisons-nous cette fonctionnalité?

Nous avons analysé le problème que cette fois n'a pas besoin de faire une dynamique lors de la création d'une instance, mais restreint directement certaines classes qui ne permettent pas cesAppel direct créé. Une méthode courante est une méthode relativement courante pour lancer une exception. Nous espérons donc ajouter une logique à ces classes,

lors de l'initialisation, il apparaîtra à un paramètre, a déclaré qu'il est fait par la classe d'usine ou non, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon , Sinon, sinon, sinon, sinon, sinon sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, sinon, si non, sinon, sinon, si non, sinon, sinon, si non, sinon, si non, sinon, si non, sinon, sinon, sinon, si non, sinon.

Ici, nous devons utiliser une autre fonction par défaut appelée __CALL__, il est

qui permet à l'objet de la classe comme une fonction d'appel

Nous sommes initialisés par le nom de la classe, en fait, également une logique d'appel. __Call__ Ceci n'est pas difficile à écrire, nous allons venir à:


class Last_of_us: def play(self): print('the Last Of Us is really funny') class Uncharted: def play(self): print('the Uncharted is really funny') class PSGame: def play(self): print('PS has many games') class GameFactory: games = {'last_of_us': Last_of_us, 'uncharted': Uncharted} def __new__(cls, name): if name in cls.games: return cls.games[name]() else: return PSGame() uncharted = GameFactory('uncharted')last_of_us = GameFactory('last_of_us') Mais le problème est que la fonction __Call____
n'ajoute pas directement directement, car sa plage d'applications est par exemple pas classer. Et nous voulons limiter les limitations lors de la création d'une instance, au lieu de restreindre la version d'appel, cette logique ne peut être réalisée que dans la classe de classe .
Nous allons activer une exception lorsque nous créons une classe en direct, car il n'est pas créé par l'usine. Nous évaluons qu'il s'agit d'une logique simple créée par l'usine, uniquement via une chaîne simple, elle utilise vraiment une logique plus complexe, ce n'est pas le centre de cet article, nous comprenons.

Logique globale comme nous attendons, indiquant que cela est vrai. Quatrièmement, Résumé


Nous sommes rares parmi les développements communs, c'est dans certaines

scènes de développement haut de gamme . Exemple: Développer un cadre ou un logicielGARS, pour faciliter l'utilisation des flux, vous devez créer une logique dynamique sur l'attribut de classe, métacico utilisé. Pour les développeurs normaux, si vous ne pouvez pas comprendre le sens et l'application de la métamorphose, il n'y a pas de relation et la fréquence d'utilisation est très faible.


def __call__(self, *args, **kwargs): if len(args) == 0 or args[0] != 'factory': raise TypeError("Can't instantiate directly") Le concept et la classe dynamique de
, le concept de langage dynamique, les caractéristiques dynamiques de la langue python sont beaucoup reflétées dans ce domaine. Par conséquent, lorsque nous comprenons les caractéristiques dynamiques de Python, elle deviendra plus et plus facile à comprendre et cela comprendra et plus profondément. Si nous faisons le taux de classe de la métamorphose et de la décoration de Python de Python, il constatera que la logique principale de deux

est similaire . Il s'agit essentiellement d'une nouvelle logique en dehors de la logique d'origine, mais seule la décoration est une logique et cette liste est ciblée en fonction des propriétés et des processus de la classe. Pensez soigneusement, je crois qu'il y aura un sentiment de dire.


Sujets

Catégories