ホームページ  >  記事  >  バックエンド開発  >  Python のメタクラスと列挙型クラスの概要 (コード例)

Python のメタクラスと列挙型クラスの概要 (コード例)

不言
不言転載
2018-12-04 17:37:002165ブラウズ

この記事では、Python のメタクラスと列挙型クラスの概要 (コード例) を紹介します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

1. メタクラス

1. type() 関数は、オブジェクトの型を返すか、新しい型を作成できます。クラス作成時の動作を変更し、動的なクラス作成を実現します。

# 第一个参数:类名
# 第二个参数:父类元祖
# 第三个参数:属性、方法
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. メタクラス

class MyType(type):
    pass

class A(metaclass=MyType):
    pass

print(type(A)) # <class &#39;__main__.MyType&#39;>

を介してクラスのメタクラスを指定できます。別の指定された関数メタクラス (再現):

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. 列挙型クラス

開発では複数の定数セットを設定することがよくありますが、Enum ではクラス内に関連する定数セットを定義でき、クラスは不変であり、メンバーを直接比較できます。

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

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

以上がPython のメタクラスと列挙型クラスの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。