【问题标题】:Dereference variables at class initialization在类初始化时取消引用变量
【发布时间】:2011-04-04 07:15:37
【问题描述】:

这是我初始化类字典的代码:

class Directory:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)
obj = Directory(name=dict())

在上述情况下,密钥是name,可以使用以下命令访问: obj.__dict__.['name']obj.name

Q1.如何以键值作为变量的值来初始化类字典?

代码应该是这样的:

name = 'bin'
obj = Directory(name=dict()) #here I want the variable `name` to be replaced by its value i.e. `bin`

Q2.还有其他最佳的实现类的方法吗? (可能是__slots__

谢谢!

【问题讨论】:

  • 如果你保持原样,这无疑需要一些eval 的黑魔法。考虑改用setattr()
  • 谢谢雷夫。它服务于目的。如果我省略了 class 的使用,而只使用 obj = dict() 会是一个好习惯吗?

标签: python dictionary


【解决方案1】:

我是否认为您希望能够使用关键字参数调用构造函数,但使用变量的值作为参数名称,而不是变量名称本身?

无法使用这种精确的语法来完成,但您可以使用以下几种其他语法:

name = 'bin'
obj = Directory(**{name: dict()})

如果您对该语法感到满意,您可以直接使用它而无需更改类(它会正常工作)。

另一种语法,如果你只想设置一个值:

name = 'bin'
obj = Directory(name, dict())

如果您对这种语法感到满意,您可以像这样重写类来支持它:

class Directory:
    def __init__(self, name, value):
        self.__dict__[name] = value

对于第二季度,__slots__ 不是您想要的。它使您可以指定“此类的所有成员都具有相同的字段”(从而避免需要字典)。你有一个很好的例子说明你不能使用__slots__,因为你的类的所有实例可能有不同的成员。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2021-03-12
    • 1970-01-01
    • 2017-05-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多