【发布时间】:2020-01-08 16:30:28
【问题描述】:
我正在寻找一种方法来动态创建具有可通过典型实例表示法访问的特定属性的类。
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
“道具”如何实际获取和修改的详细信息将被隐藏。 这也使得在新道具可用时添加对它们的访问变得更加容易。
我尝试了以下技术,以了解 python 如何动态生成基本类属性:
Class factory to produce simple struct-like classes?
我对 python 的初步阅读表明,类属性是处理引入 getter/setter 方法以进行访问的一种方法。
不清楚的是如何在工厂构造方法中动态指定属性名(无论是使用装饰器还是显式的property()调用)
例如,使用 property() 。 . .
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)
当类被声明/构造时,我需要为每个请求的道具创建一个集合。例如,DynoOne 类将为“A”和“B”具有单独的属性/setter/getter。
我怀疑基于模板的 eval() 策略会起作用,但我可能缺少一些更基本和有效的技术。
感谢启蒙和学习机会 :-)
【问题讨论】:
-
可以说我有以下几点:
-
我已经做了一些在工厂环境中使用 type() 的实验,特别是使用 init 建立本地实例属性。然而,在感兴趣的情况下,内容需要计算我知道这是使用函数接口
python print ('computed content {}'.format(my_instance.getComputed() ))执行此操作的方法但我仍然希望访问形式为:python print ('computed content {}'.format(my_instance.Computed)) -
对格式化感到抱歉——我第一次发布并学习导航 API。 . .
-
嗯,这正是
property的用途,或者如果property不适合您,您可以实现自己的自定义描述符对象...
标签: python python-3.x class metaprogramming