-1

我正在尝试在我的班级中编写一个方法并尝试以dict.

class Test(object):
    location = 'Dhaka'

    @classmethod
    def get_items(cls):
        items = dict()

        for item in cls:
            items[item.name] = item.value

        return items


class NewTest(Test):
    lat = 4444

我试图得到以下结果:

print(NewTest.get_items())
{'location': 'Dhaka', 'lat': 4444}

但是不能迭代像那种类型的返回错误。

4

2 回答 2

0

类不能迭代;不过它的__dict__属性可以。

@classmethod
def get_items(cls):
    items = dict()

    # Loop defined enums
    for item in cls.__dict__:
        if item == "__module__":
            continue
        items[item] = cls.__dict__[item]

    # return in tuple
    return items

您需要对字典的键进行一些过滤,因为除了您创建的属性之外,该类可能还有其他属性。

于 2020-11-16T17:03:01.787 回答
0

您可以查看应用于dir()类的内容以获取其所有属性,但在查找类变量时需要一些方法来过滤掉具有特殊名称的事物。一种相当快速的方法是使用正则表达式模式匹配来识别它们。您还需要过滤掉类方法等可调用值get_items()

两者都做如下图所示。

import re

DUNDER = re.compile(r'^__[^\d\W]\w*__\Z', re.UNICODE)  # Special method names.


class Test(object):
    location = 'Dhaka'

    @classmethod
    def get_items(cls):
        is_special = DUNDER.match  # Local var to speed access.
        items = {}

        for name in dir(cls):
            if not is_special(name):
                value = getattr(cls, name)
                if not callable(value):
                    items[name] = value

        return items


class NewTest(Test):
    lat = 4444


print(NewTest.get_items())  # -> {'lat': 4444, 'location': 'Dhaka'}
于 2020-11-16T18:50:06.023 回答