>  기사  >  백엔드 개발  >  Python의 메타클래스 및 열거형 클래스 소개(코드 예제)

Python의 메타클래스 및 열거형 클래스 소개(코드 예제)

不言
不言앞으로
2018-12-04 17:37:002164검색

이 글은 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.metaclass를 통해 클래스의 메타클래스를 지정할 수 있습니다

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. 열거형 클래스

개발 중에는 여러 세트의 상수가 설정되는 경우가 많습니다. 클래스에서 관련 상수 집합을 정의하고, 클래스를 변경할 수 없도록 만들고, 멤버를 직접 비교할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제