Maison  >  Article  >  développement back-end  >  Introduction aux métaclasses et aux classes d'énumération en Python (exemples de code)

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

不言
不言avant
2018-12-04 17:37:002209parcourir

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

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;>

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

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开始计数。

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus