我想知道Python是否有类似C#匿名类的功能.为了澄清,这是一个示例C#片段:
var foo = new { x = 1, y = 2 };
var bar = new { y = 2, x = 1 };
foo.Equals(bar); // "true"
Run Code Online (Sandbox Code Playgroud)
在Python中,我会想象这样的事情:
foo = record(x = 1, y = 2)
bar = record(y = 2, x = 1)
foo == bar # true
Run Code Online (Sandbox Code Playgroud)
具体要求是能够在表达式上下文中创建具有指定字段的对象(例如,在lambda和其他不允许语句的地方可用),没有额外的外部声明,并且能够通过普通成员按名称访问各个组件访问语法foo.bar.创建的对象还应该按组件名称 (而不是按位置,如元组那样)实现结构比较.
特别是:元组不是因为它们的组件没有命名; 课程不是因为它们需要声明; dicts不是因为他们有不受欢迎的foo["bar"]语法来访问组件.
namedtuple不是它,因为即使你定义内联类型它仍然需要一个名称,并且比较是基于位置的,而不是基于名称的.特别是:
def foo(): return namedtuple("Foo", "x y")(x = 1, y = 2)
def bar(): return namedtuple("Foo", "y x")(x = …Run Code Online (Sandbox Code Playgroud) 我正在调试一些Python,它接受一个对象列表作为输入,每个对象都有一些属性.
我想硬编码一些测试值 - 比方说,一个四个对象的列表,其"foo"属性设置为某个数字.
有比这更简洁的方法吗?
x1.foo = 1
x2.foo = 2
x3.foo = 3
x4.foo = 4
myfunc([x1, x2, x3, x4])
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只想说出类似的话:
myfunc([<foo=1>, <foo=2>, <foo=3>, <foo=4>])
Run Code Online (Sandbox Code Playgroud)
(显然,这是伪造的语法.但是有类似的东西真的有效吗?)
注意:这将永远不会被签入.它只是一些一次性的调试代码.所以不要担心可读性或可维护性.
在Java中,您可以使用匿名内部类定义新的内联类.当您只需要重写该类的单个方法时,这非常有用.
假设您要创建一个子类OptionParser,只覆盖一个方法(例如exit()).在Java中,您可以编写如下内容:
new OptionParser () {
public void exit() {
// body of the method
}
};
Run Code Online (Sandbox Code Playgroud)
这段代码创建了一个匿名类,OptionParser它只扩展和覆盖该exit()方法.
Python中有类似的习惯用法吗?在这些情况下使用哪种成语?