我有以下课程:
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。
答案 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__()
。