在__init__中获取有序的字典类属性

时间:2016-09-16 09:58:27

标签: python class object dictionary

我有以下课程:

class NewName:
    def __init__(self):
        self.Name = None
        self.DecomposedAlias = OrderedDict([("Prefix", None),
                                            ("Measurement", None),
                                            ("Direction", None),
                                            ("Item", None),
                                            ("Location", None),
                                            ("Descriptor", None),
                                            ("Frame", None),
                                            ("RTorigin", None)])
        self.Meaning = ""
        self.SIUnit = OrderedDict([("ScaleFactor", None),
                                   ("Offset", None),
                                   ("A", None),
                                   ("cd", None),
                                   ("K", None),
                                   ("kg", None),
                                   ("m", None),
                                   ("mol", None),
                                   ("rad", None),
                                   ("s", None)])
        self.NormalDisplayUnit = OrderedDict([("ScaleFactor", None),
                                              ("Offset", None),
                                              ("A", None),
                                              ("cd", None),
                                              ("K", None),
                                              ("kg", None),
                                              ("m", None),
                                              ("mol", None),
                                              ("rad", None),
                                              ("s", None)])
        self.OrientationConvention = ""
        self.ContactPerson = ""
        self.Note = ""
        self.SubType = None
        self.RefersTo = []

如果我实例化这个类的新对象,我可以获得这样的字典:

mynewname = NewName()
mynewdict = mynewname.__dict__

如果我希望mynewdict的排序方式与NewName__init__的{​​{1}}属性相同,那么该怎么办?

我做了一些研究this,但就我而言,我只会获得['__init__']。有没有办法指向__init__

中的属性

为了完整起见,我应该提到我使用的是Python 3.4。

1 个答案:

答案 0 :(得分:1)

你不能这样做,因为__init__属性在创建实例后被调用(__new__()),所以如果你甚至覆盖__new__()并使用{{ 1}}方法using a metaclass,你可以得到__prepare__方法中没有定义的其他方法和属性的有序序列(dict等)。

同样基于this mail

  

除了作为类型__init__的字典之外,不可能有某种不同的东西。这是一个刻意的限制,需要优化。

但这并不意味着您无法获得班级的有序属性列表。由于每个属性都按__dict__方法设置,因此您可以通过覆盖__setattr__方法简单地保留有序字典中的属性:

__setattr__

输出:

from collections import OrderedDict

class NewName:
    ordered_attrs = OrderedDict()
    def __setattr__(self, name, val):
        object.__setattr__(self, name, val)
        # Use setattr(self, name, val) if you don't want to preserve the attributes in instances `__dict__`
        NewName.ordered_attrs[name] = val

    def __init__(self):
        # your __init__ body

mynewname = NewName()
print(list(NewName.ordered_attrs))

同样关于设置属性,基于documentation

  

如果['Name', 'DecomposedAlias', 'Meaning', 'SIUnit', 'NormalDisplayUnit', 'OrientationConvention', 'ContactPerson', 'Note', 'SubType', 'RefersTo'] # Output of mynewname.__dict__ {'Note': '', 'Meaning': '', 'RefersTo': [], 'SIUnit': OrderedDict([('ScaleFactor', None), ('Offset', None), ('A', None), ('cd', None), ('K', None), ('kg', None), ('m', None), ('mol', None), ('rad', None), ('s', None)]), 'DecomposedAlias': OrderedDict([('Prefix', None), ('Measurement', None), ('Direction', None), ('Item', None), ('Location', None), ('Descriptor', None), ('Frame', None), ('RTorigin', None)]), 'SubType': None, 'Name': None, 'ContactPerson': '', 'NormalDisplayUnit': OrderedDict([('ScaleFactor', None), ('Offset', None), ('A', None), ('cd', None), ('K', None), ('kg', None), ('m', None), ('mol', None), ('rad', None), ('s', None)]), 'OrientationConvention': ''} 要分配给实例属性,则应调用具有相同名称的基类方法,例如__setattr__()