class - 在 Python 中制定动态类

标签 class python-3.x

我编写了一个小函数,用于在 Python 中利用动态地制定类(或者更具体地说,类似 C 的结构,嗯,或多或少)。我想知道我是否做对了一切。这些类可以实例化,但我怀疑插槽没有被正确使用。相反,我不知道它们是否确实被正确使用。

def formulate(name, **data):
   def __init__(self, **data):
      self.__dict__.update(data)
   struct = type(name, (), data)
   struct.__init__ = __init__
   struct.__slots__ = data.keys()
   return struct

谢谢。 艾丽莎。

最佳答案

包含 __slots____init__ 作为字典中的键 传递给类型:

def formulate(name, **data):
   def __init__(self):                 # 1
       for key, val in data.items():   
           setattr(self, key, val)     # 2
   struct = type(name, (), {'__slots__': tuple(data.keys()), '__init__': __init__})
   return struct

Bar = formulate('Bar', **dict(a=1, b=2))  # 3
bar = Bar()                               # 4
print('__dict__' in dir(bar))
# False
print('__slots__' in dir(bar))
# True
print(bar.__slots__)
# ['a', 'b']
print(bar.a)
# 1
  1. 请注意,我更改了 __init__ 的定义

    def __init__(self, **data):
    

    def __init__(self):
    

    如果您使用原始版本,则用于更新的数据 槽键必须通过调用 Bar 提供:

    bar = Bar(**dict(a=1, b=2))
    

    这会很糟糕,因为它需要你重复相同的字典 两次——一次在#4,一次在#3。

    您似乎更有可能希望#3 控制初始值 插槽键。在这种情况下,请勿将 data 列为 __init__。通过省略它,Python 使用 LEGB rule看看 增加data的值。它会在封闭的范围内找到它 formulate 函数。 __init__ 则被称为 a closure .

  2. 由于具有 __slots__ 的类没有 __dict__ 属性 默认情况下,我们不能/不应该使用 self.__dict__.update(data) 。 相反,请使用 setattr 设置插槽键。

关于class - 在 Python 中制定动态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22377735/

相关文章:

java - 在java中访问我的方法所在的类

python-3.x - Spyder 未启动,出现 TypeError : __init__() missing 1 required positional argument

python-3.x - 模块 'dask' 没有属性 'read_fwf'

python - 使用 __init__() 方法理解 Python super()

c++ - 指向类中多维数组的指针

python - 如何动态构造方法?

c++ - 如何定义矩阵-矩阵乘法,使其也适用于 vectorXvector、vectorXmatrix 和 matrixXvector?

python - 为什么当我点击 Dictionary 变量时 Spyder 不能打开它?

python-3.x - 如何计算像素周围像素的平均值?

python - 值错误 : dimension of the inputs to `Dense` should be defined. 发现 `None`