动态创建 class 个属性
creating class properties dynamically
我正在寻找一种动态创建具有特定属性的 classes 的方法,这些属性可通过典型的实例表示法访问。
DynoOne = createClass('DynoOne',props=['A','B'])
d = DynoOne (database='XYZ')
d.A = d.B + 1
DynoTwo = createClass('DynoTwo',props=['A','C','E'])
q = DynoTwo (database='QRS')
q.A = q.C + 2*q.E
有关 "props" 实际获取和修改方式的详细信息将被隐藏。
这也使得在新道具可用时添加对它们的访问变得更加容易。
我尝试了如下技术,以了解 python 如何动态生成基本 class 属性:
Class factory to produce simple struct-like classes?
我对 python 的初步阅读表明 class 属性是处理引入 getter/setter 访问方法的一种方式。
不清楚的是如何在工厂构造方法中动态指定 属性 名称(无论是使用装饰器还是显式 属性() 调用)
例如,使用 属性() 。 . .
class DynamicClass( someBase ):
def dynamic_getter(self):
# acquire "stuff"
return stuff
def dynamic_setter(self,stuff):
# store "stuff"
pass
dynamic_property_name = property(fget=dynamic_getter,fset=dynamic_setter)
当 class 为 declared/constructed 时,我需要为每个请求的道具创建一个集合。例如,DynoOne class 对于 'A' 和 'B' 会有单独的 property/setter/getter。
我怀疑基于模板的 eval() 策略会起作用,但我可能遗漏了一些更基本和更有效的技术。
感谢启发和学习机会:-)
type
的三个参数 for 允许您动态创建 classes。所以,草图:
def dynamic_getter(self):
# acquire "stuff"
return stuff
def dynamic_setter(self,stuff):
# store "stuff"
pass
DynamicClass = type('DynamicClass', (SomeBase,), {"dynamic_property_name":property(fget=dynamic_getter,fset=dynamic_setter)})
或者,更具体地说:
In [1]: class SomeBase:
...: def __init__(self):
...: self._foo = 42
...:
...: def dynamic_getter(self):
...: # acquire "stuff"
...: return self._foo
...:
...: def dynamic_setter(self,stuff):
...: # store "stuff"
...: pass
...:
...: DynamicClass = type('DynamicClass', (SomeBase,), {"dynamic_property_name":property(fget=dynamic_getter,fset=dynamic_setter)})
In [2]: instance = DynamicClass()
In [3]: instance.dynamic_property_name
Out[3]: 42
注意:type
字面上和其他对象一样是一个 class 对象,以三参数形式调用它是新 class 对象实例的构造函数,它是class 创建其他 class 对象,即元 class。实际上,您可以将 class 定义语句视为上述内容的语法糖。
A template-based with exec
(如果你想使用复杂的语句,你需要exec
,eval
只允许表达式)方法也是可行的,如果你会发现它更容易使用。事实上,这就是 collections.namedtuple
在标准库中的工作方式。
注意:您似乎对 Python 中属性的性质感到困惑。 class 上未指定实例属性,相反,您将添加一个函数来初始化这些实例属性(通常为 __init__
),但您可以在任何地方添加实例属性 ,甚至在 method/class.
之外
在python中,实例变量存储在一个dict下,可用于在对象创建时创建动态实例变量class。
比方说,我有一个字典 {'a':1},其中键 'a' 应该被分配为一个变量,1 作为它的值。
在__init__
函数下,我们可以这样做,
self.__dict__['a'] = 1
我们可以使用 for 循环遍历字典并执行上述操作来创建动态变量。
根据@chepner的建议,我们也可以使用setattr
函数来动态设置变量。
我正在寻找一种动态创建具有特定属性的 classes 的方法,这些属性可通过典型的实例表示法访问。
DynoOne = createClass('DynoOne',props=['A','B'])
d = DynoOne (database='XYZ')
d.A = d.B + 1
DynoTwo = createClass('DynoTwo',props=['A','C','E'])
q = DynoTwo (database='QRS')
q.A = q.C + 2*q.E
有关 "props" 实际获取和修改方式的详细信息将被隐藏。 这也使得在新道具可用时添加对它们的访问变得更加容易。
我尝试了如下技术,以了解 python 如何动态生成基本 class 属性:
Class factory to produce simple struct-like classes?
我对 python 的初步阅读表明 class 属性是处理引入 getter/setter 访问方法的一种方式。
不清楚的是如何在工厂构造方法中动态指定 属性 名称(无论是使用装饰器还是显式 属性() 调用)
例如,使用 属性() 。 . .
class DynamicClass( someBase ):
def dynamic_getter(self):
# acquire "stuff"
return stuff
def dynamic_setter(self,stuff):
# store "stuff"
pass
dynamic_property_name = property(fget=dynamic_getter,fset=dynamic_setter)
当 class 为 declared/constructed 时,我需要为每个请求的道具创建一个集合。例如,DynoOne class 对于 'A' 和 'B' 会有单独的 property/setter/getter。
我怀疑基于模板的 eval() 策略会起作用,但我可能遗漏了一些更基本和更有效的技术。
感谢启发和学习机会:-)
type
的三个参数 for 允许您动态创建 classes。所以,草图:
def dynamic_getter(self):
# acquire "stuff"
return stuff
def dynamic_setter(self,stuff):
# store "stuff"
pass
DynamicClass = type('DynamicClass', (SomeBase,), {"dynamic_property_name":property(fget=dynamic_getter,fset=dynamic_setter)})
或者,更具体地说:
In [1]: class SomeBase:
...: def __init__(self):
...: self._foo = 42
...:
...: def dynamic_getter(self):
...: # acquire "stuff"
...: return self._foo
...:
...: def dynamic_setter(self,stuff):
...: # store "stuff"
...: pass
...:
...: DynamicClass = type('DynamicClass', (SomeBase,), {"dynamic_property_name":property(fget=dynamic_getter,fset=dynamic_setter)})
In [2]: instance = DynamicClass()
In [3]: instance.dynamic_property_name
Out[3]: 42
注意:type
字面上和其他对象一样是一个 class 对象,以三参数形式调用它是新 class 对象实例的构造函数,它是class 创建其他 class 对象,即元 class。实际上,您可以将 class 定义语句视为上述内容的语法糖。
A template-based with exec
(如果你想使用复杂的语句,你需要exec
,eval
只允许表达式)方法也是可行的,如果你会发现它更容易使用。事实上,这就是 collections.namedtuple
在标准库中的工作方式。
注意:您似乎对 Python 中属性的性质感到困惑。 class 上未指定实例属性,相反,您将添加一个函数来初始化这些实例属性(通常为 __init__
),但您可以在任何地方添加实例属性 ,甚至在 method/class.
在python中,实例变量存储在一个dict下,可用于在对象创建时创建动态实例变量class。
比方说,我有一个字典 {'a':1},其中键 'a' 应该被分配为一个变量,1 作为它的值。
在__init__
函数下,我们可以这样做,
self.__dict__['a'] = 1
我们可以使用 for 循环遍历字典并执行上述操作来创建动态变量。
根据@chepner的建议,我们也可以使用setattr
函数来动态设置变量。