动态创建类属性

2024-04-18

我正在寻找一种方法来动态创建具有可通过典型实例表示法访问的特定属性的类。

       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 如何动态生成基本类属性:

类工厂来生成简单的类似结构的类? https://stackoverflow.com/questions/1264833/class-factory-to-produce-simple-struct-like-classes/1275088#1275088

我对 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允许您动态创建类。所以,画一个草图:

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

Note: type从字面上看,它是一个像其他类对象一样的类对象,以三参数形式调用它是新类对象实例的构造函数,它是创建其他类对象的类,即元类。事实上,您可以将类定义语句视为上述内容的语法糖。

基于模板的exec(如果你想使用复杂的语句,你需要exec, eval仅允许表达式)方法也是可行的,如果您发现这种方法更容易使用。确实如此collections.namedtuple在标准库中工作。

注意:您似乎对 Python 中属性的性质感到困惑。实例属性未在类上指定,相反,您需要添加一个函数来初始化这些实例属性(通常是__init__)但您可以添加实例属性anywhere,甚至在方法/类之外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态创建类属性 的相关文章

随机推荐