一个多余但很酷的动态python结构和关于装饰器、理解、语法的问题

2024-10-04 09:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

关于python语法,你可以做一些有趣的事情。在

当我从matlab转到python时,我创建了一个类似于matlab的struct的类

class DynStruct(AbstractPrintable):
    ' dynamical add and remove members '
    def __init__(self, child_exclude_list=[]):
        super(DynStruct, self).__init__(child_exclude_list)

它只是一个对象,您可以在其中动态添加成员,而不必这样做 查字典(因为我讨厌打引号)

我还制作了一个很酷的helper类,可以很好地打印出类的成员,这样您就可以 在IPython工作时看看你在做什么。(我省略了我的进口产品,但它只是一些标准的东西和一些新的东西)

^{pr2}$

然后我有一个例子,我需要从DynStruct中获取一组元素,所以我添加了一个函数,它返回我想要的元素的元组。在

^{3}$

例如:

>> point = DynStruct()
>> point.x = 3
>> point.y = 1
>> point.z = 60
>> print point

DynStruct
    int x = 3
    int y = 1
    int z = 60

 >> # Now I want to get the points
 >> (x,y,z) = point.getprops('x','y','z')

现在,这很好用,它使调试变得非常容易。但我遇到了一个案例,我想同时设置一系列属性(类似于上面)。我意识到还有其他方法可以做到这一点,但我真的希望有一个setprop,它的语法是这样工作的:

point.setprops('x','y','z') = (14, 22, 30)

我不确定,但我觉得可能有一种方法可以做到这一点,因为@塞特人装饰工。但我不知道如何重载equals运算符以这种方式使用它,或者如果可能的话。在

我想我现在就这样写吧 点集属性(“x”、“y”、“z”,14、22、30)


Tags: 方法selfchild元素属性init语法成员
2条回答

it is just an object where you can dynamically add members without having to resort a dictionary (because I hate typing quotes)

也许我在你的解释中漏掉了什么,但你不能已经这样做了吗?例如

class Foo(Object):
    def __init__(self):
        pass

f = Foo()
f.x = 1
f.y = 2
f.z = 3

print f.x, f.y, f.z # outputs 1 2 3

作为第二个问题的语法

point.setprops('x','y','z') = (14, 22, 30)

不幸的是,我不确定这是否可能。原因是

point.setprops('x', 'y', 'z')

是一个“call”表达式。由于python的解析方式,我认为不能在赋值语句的左侧有一个调用表达式。据我所知,你只能有一个变量名或切片/索引表达式的列表。话虽如此,我也不是百分之百肯定。可能有一些疯狂的Python忍者的东西,你可以做的工作。在

一开始,你不需要这个-因为你可以:

point.x, point.y, point.z = (14, 22, 30)
# Tuple unpacking ... is there nothing it cannot do?

但是,假设这还不够清楚,您需要能够同时设置多个字段。然后可以使用^{}

^{pr2}$

然后可以执行以下操作:

point['x', 'y', 'z'] = (14, 22, 30)

然后,您还可以将getprops方法替换为^{}方法,类似地实现并能够做到:

x, y, z = point['x', 'y', 'z']

相关问题 更多 >