Introduction aux métaclasses et aux classes d'énumération en Python (exemples de code)

不言
Libérer: 2018-12-04 17:37:00
avant
2193 Les gens l'ont consulté

Cet article vous présente une introduction aux métaclasses et aux classes d'énumération en Python (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Métaclasse

1. La fonction type() peut renvoyer le type de l'objet ou créer un nouveau type. Il peut modifier le comportement lors de la création d'une classe et réaliser une création dynamique de classes.

# 第一个参数:类名
# 第二个参数:父类元祖
# 第三个参数:属性、方法
A = type("A",(object,),{"name":"zhou"})
a = A()
print(type(A)) # <class &#39;type&#39;>
print(type(a)) # <class &#39;__main__.A&#39;>
print(a.name) # zhou
Copier après la connexion

2. Vous pouvez spécifier la métaclasse d'une classe via la métaclasse

class MyType(type):
    pass

class A(metaclass=MyType):
    pass

print(type(A)) # <class &#39;__main__.MyType&#39;>
Copier après la connexion

Une autre métaclasse de fonction désignée (réimprimée) :

def upper_attr(future_class_name, future_class_parents, future_class_attr):
    attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
    uppercase_attr = dict((name.upper(), value) for name, value in attrs)
    return type(future_class_name, future_class_parents, uppercase_attr)

class Foo(metaclass = upper_attr): # 指定元类
    bar = 'bip'

print(hasattr(Foo, 'bar'))
# 输出: False
print(hasattr(Foo, 'BAR'))
# 输出:True
Copier après la connexion

2. Classe d'énumération

Plusieurs ensembles de constantes sont souvent définis pendant le développement. Enum peut définir un ensemble de constantes associées dans une classe, et la classe est immuable et les membres peuvent être directement comparés.

from enum import Enum

pay_methods = Enum("PayMethods",("CASH","WEIXIN","ALIPAY","UNIONPAY",))

for name, member in pay_methods.__members__.items():
    print(name, ',', member, ',', member.value)
# CASH , PayMethods.CASH , 1
# WEIXIN , PayMethods.WEIXIN , 2
# ALIPAY , PayMethods.ALIPAY , 3
# UNIONPAY , PayMethods.UNIONPAY , 4
# value属性则是自动赋给成员的int常量,默认从1开始计数。
Copier après la connexion

peut également être personnalisé en héritant de la classe Enum :

from enum import Enum, unique


@unique  # 帮助我们检查是否重复
class PayMethods(Enum):
    CASH = 0  # 设置CASH.value = 0
    WEIXIN = 1
    ALIPAY = 2
    UNIONPAY = 3


print(PayMethods['CASH'])  # PayMethods.CASH
print(PayMethods(1))  # PayMethods.WEIXIN
print(PayMethods.ALIPAY.value)  # 2
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!