python有代码吗_python有匿名类吗?

我想知道python是否有类似c匿名类的特性。为了澄清,这里有一个示例C片段:

var foo = new { x = 1, y = 2 };

var bar = new { y = 2, x = 1 };

foo.Equals(bar); // "true"

在python中,我可以想象这样的情况:

foo = record(x = 1, y = 2)

bar = record(y = 2, x = 1)

foo == bar # true

特定的要求是能够在表达式上下文中创建具有指定字段的对象(例如,在lambda和不允许使用语句的其他位置中可用),不需要额外的外部声明,并且能够通过普通成员访问语法按名称访问单个组件。

foo.bar

. 创建的对象还应实现结构比较

按组件名称

(不是按位置,就像元组那样)。

尤其是:元组不是因为它们的组件没有命名;类不是因为它们需要声明;dict不是因为它们不需要声明

foo["bar"]

访问组件的语法。

namedtuple

不是吗,因为它仍然需要一个名称,即使您定义了类型inline,并且比较是基于位置的,而不是基于名称的。特别地:

def foo(): return namedtuple("Foo", "x y")(x = 1, y = 2)

def bar(): return namedtuple("Foo", "y x")(x = 1, y = 2)

foo() == bar() # False because fields are compared in order, and not by name

# True would be desired instead

如果需要的话,我知道如何用Python编写这样的东西。但我想知道,在Python标准库或任何流行的第三方库中是否有类似的东西。

[编辑]

为了这个目的,这里有一个单一的表达式解决方案,它结合了ken和alanlcode提供的两个非常有用的答案,在没有任何额外的外部声明的情况下产生了结构平等:

type("", (), { \

"__init__": (lambda self, **kwargs: self.__dict__.update(kwargs)), \

"__eq__": (lambda self, other: self.__dict__ == other.__dict__) } \

)(x = 1, y = 2)

从技术上讲,它满足了问题的所有要求,但我真诚地希望没有人使用它(我绝对不会)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值