资讯专栏INFORMATION COLUMN

Python元类与枚举类

TigerChain / 3421人阅读

摘要:第一个参数类名第二个参数父类元祖第三个参数属性方法可以通过指定类的元类另一种指定函数元类转载指定元类输出输出二枚举类在开发中经常设置多组常量,可以把一组相关常量定义在一个中,且不可变,而且成员可以直接比较。

一、元类

1、type()函数可以返回对象的类型,也可以创建出新的类型。它可以改变类创建时的行为,实现动态创建类。

# 第一个参数:类名
# 第二个参数:父类元祖
# 第三个参数:属性、方法
A = type("A",(object,),{"name":"zhou"})
a = A()
print(type(A)) # 
print(type(a)) # 
print(a.name) # zhou

2、可以通过metaclass指定类的元类

class MyType(type):
    pass

class A(metaclass=MyType):
    pass

print(type(A)) # 

另一种指定函数元类(转载):

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
二、枚举类

在开发中经常设置多组常量,Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42708.html

相关文章

  • How does it work - with_metaclass

    摘要:先简单介绍下中的元类。元类就是创建类的类,对于元类来说,类是它的实例,将返回。中的所有类,都是的实例,换句话说,是元类的基类。 我在看源代码的时候,经常蹦出这一句:How does it work!竟然有这种操作?本系列文章,试图剖析代码中发生的魔法。顺便作为自己的阅读笔记,以作提高。 先简单介绍下Python中的元类(metaclass)。元类就是创建类的类,对于元类来说,类是它的实...

    testbird 评论0 收藏0
  • Python 的 enum 模块源码分析

    摘要:起步上一篇的枚举类型文末说有机会的话可以看看它的源码。但这样的方式并不好,范围大,它包含该类的所有属性和方法。而不单单是枚举的命名空间。每个成员都有名称属性和值属性上述的代码中,取得的值是。 起步 上一篇 《Python 的枚举类型》 文末说有机会的话可以看看它的源码。那就来读一读,看看枚举的几个重要的特性是如何实现的。 要想阅读这部分,需要对元类编程有所了解。 成员名不允许重复 这部...

    muddyway 评论0 收藏0
  • Python模块文档学习之抽象基abc模块

    摘要:里面关于抽象类的相关介绍中并没有提供抽象类与抽象方法,但是提供了内置模块来模拟实现抽象类。主要类或函数这是用来生成抽象基础类的元类。继承方式中的抽象类模块定义了几个抽象类。 PEP里面关于抽象类的相关介绍:https://www.python.org/dev/pe...python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现...

    lauren_liuling 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<