python是否有类似于setattr的方法,但是对于python类?

2024-10-02 10:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,\uusetattr\只起作用。课堂上有没有类似的方法?我之所以问这个问题,是因为我想在用户在类中定义时按顺序收集已定义属性的列表,如下所示:

class CfgObj(object):
    _fields = []
    def __setattr__(self, name, value):
        self._fields.append([name, value])
        object.__setattr__(self, name, value)

class ACfg(CfgObj):
    setting1 = Field(str, default='set1', desc='setting1 ...')
    setting2 = Field(int, default=5, desc='setting2...')

我知道上面的代码将无法按预期工作,因为setattr_u只由实例调用,如下所示:

^{pr2}$

那么,对于python类,有没有等价的setattr\uu?主要目的是当用户在类中定义define属性时,按顺序收集define属性。在


Tags: 用户nameselfdefaultfieldfields属性定义
3条回答

如果在类的元类上定义__setattr__(),则在设置类的属性时将调用它,但仅在创建类之后:

>>> class Meta(type):
...     def __setattr__(cls, name, value):
...         print "%s=%r" % (name, value)
... 
>>> class A(object):
...     __metaclass__ = Meta
... 
>>> A.a = 1
a=1

但在类定义时它不起作用,所以它可能不是您想要的。在

在元类__init__()中获取类属性是可行的,但是您会失去定义的顺序(以及多个定义)。在

是的,但是that's not how you want to do it。在

class MC(type):
  def __init__(cls, name, bases, dct):
    print dct
    super(MC, cls).__init__(name, bases, dct)

class C(object):
  __metaclass__ = MC
  foo = 42

要解决您的问题而不是您的问题的方法是设置字段创建的时间戳创建Field对象的计数器,并将计数器的当前值设置为已创建的值:

class Field(object):
    count = 0
    def __init__(self, value, default=None, desc=None):
        self.value = value
        self.default = default
        self.desc = desc
        # Here comes the magic
        self.nth = Field.count
        Field.count += 1
        # self.created_at = time.time()

然后我将创建一个方法来返回按计数器值排序的所有字段:

^{pr2}$

它的用法很直观:

class ACfg(CfgObj):
    setting1 = Field(str, default='set1', desc='setting1 ...')
    setting2 = Field(int, default=5, desc='setting2...')

print ACfg().params()

显然,字段是按对象创建的时间排序的,而不是按字段的创建时间排序,但这对您来说已经足够了。它是?在

相关问题 更多 >

    热门问题