python - 在 Python 中按顺序获取实例变量

标签 python

假设我有以下类(class):

class Foo(object):
    def __init__(self, value):
        self.d = value
        self.a = value
        self.s = value
        self.k = value

我要retrieve the instance variables按照声明的顺序。

我尝试使用 vars() 但没有成功:

list(vars(Foo('value')).keys())
# ['a', 'k', 's', 'd']

我想要什么:

list(magic_method(Foo('value')).keys())
# ['d', 'a', 's', 'k']

编辑:

显然,每个字段都有不同的值。

我的目标是通过对象变量生成 XML。为了有效,XML 标记必须按正确的顺序排列。

结合 __iter__ 覆盖,我只需管理对象字典即可生成我的 XML。

让我们以图书馆为例。假设您有一个类 BookDatePersonAuthorBorrower:

class Book(object):
    def self.__init__()
        self._borrower = Borrower()
        self._author = Author()

class Date(object)
    def __init__(self, date):
        self._date = date

class Person(object):
    def __init__(self, name):
        self._name = name

class Author(object):
    def __init__(self):
        self._person = Person("Daniel")

class Borrower(object):
    def __init__(self):
        self._person = Person("Jack")
        self._date = Date("2016-06-02")

我想创建以下 XML:

<Book>
    <Borrower>
        <Person>Jack</Person>
        <Date>2016-06-02</Date>
    </Borrower>
    <Author>
        <Person>Daniel</Person>
    </Author>
</Book>

我知道这些类可能看起来很奇怪(比如这里的日期),但我想让问题尽可能简单(并且有些字段非常有意义)。实际上,我会查询数据库并可能在初始化程序中传递记录标识符。关键是有些数据遵循相同的语法(即这里的 Person)。

总而言之,我想使用 Python 对象创建这样一个 XML。订购很重要。这就是为什么我想为此目的按顺序检索变量:然后我可以提取类并生成 XML 标记。

最佳答案

如果你想对对象变量进行排序,你可以使用类似的东西:

from collections import OrderedDict

class FooModel(object):
    def __new__(cls, *args, **kwargs):
        instance = object.__new__(cls)
        instance.__odict__ = OrderedDict()
        return instance

    def __setattr__(self, key, value):
        if key != '__odict__':
            self.__odict__[key] = value
        object.__setattr__(self, key, value)

    def keys(self):
        return self.__odict__.keys()

    def iteritems(self):
        return self.__odict__.iteritems()


class Foo(FooModel):
    def __init__(self, value):
        self.d = value
        self.a = value
        self.s = value
        self.k = value

输出:

>>> f = Foo('value')
>>> f.x = 5
>>> f.y = 10
>>> f.a = 15
>>> f2 = Foo('value')
>>> print "f.keys()", f.keys()
f.keys() ['d', 'a', 's', 'k', 'x', 'y']
>>> print "f2.keys()", f2.keys()
f2.keys() ['d', 'a', 's', 'k']
print list(f.iteritems())
[('d', 'value'), ('a', 15), ('s', 'value'), ('k', 'value'), ('x', 5), ('y', 10)]

关于python - 在 Python 中按顺序获取实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37591180/

相关文章:

python - Anaconda 和 jupyter 笔记本 : How to switch the used virtual environment?

python - 如何在 np.linalg.inv 函数的奇异矩阵上传递引发的错误?

python - Django ifequal 和 if 语句总是转到 Else 标签

python - 在 pandas 的 groupby 中滚动应用函数

python - 以 root 身份运行时 Chromium webdriver 错误

python - 在Python中将2个文本文件合并为一个具有2列的文本文件

python - ffmpeg:使用脚本获取持续时间:无法为 '2>&1 | grep "持续时间找到合适的输出格式“”

python - 使用 pandas 仅保留 timedelta=1 分钟的数据

Python AF_UNIX 客户端 C 服务器

python - 从views.py导入不适用于应用程序