如何使用 class 继承传递参数?

How can you pass arguments with class inheritance?

我有 12 个 class 看起来像这样,唯一的区别是 DefaultAsset 全局对象。我有 12 个全局 DefaultAssetOrderedDict,例如 DefaultAssetsOrderedDictNewAssetsOrderedDictOldAssetsOrderedDict 等。我没有将它们作为每个 class 的一部分,因为它们很大,我怀疑这样做会导致多个实例是静态的,如果我错了请纠正我(我有很多内存问题,从 OrderDict 数据行切换到 class数据行来修复它)

class DefaultAsset(object):
    __slots__ = list(DefaultAssetOrderedDict.keys())

    def __init__(self, **kwargs):
        for arg, default in DefaultAssetOrderedDict.items():
            setattr(self, arg, re.sub(r'[^\x00-\x7F]', '', kwargs.get(arg, default)))
            #print (str(arg) + " : "+ str(re.sub(r'[^\x00-\x7F]', '', kwargs.get(arg, default))))

    def items(self):
        for slot in self.__slots__:
            yield slot, getattr(self, slot)

    def values(self):
        for slot in self.__slots__:
            yield getattr(self, slot)

所以,我想知道如何重写 class 上面的代码,使其成为名为 Rows 的父 class,这样我就可以做这样的事情:

class DefaultAssets (Row, DefaultAssetOrderedDict):
    #does the same thing but per the OrderedDict in second argument

或者也许:

DefaultAssets =  Rows(DefaultAssetOrderedDict)
NewAssets =  Rows(NewAssetOrderedDict)

如果我正确理解了您的主要目标,我觉得您可以使用元类将 12 个 OrderedDict 实例变成单独的 类 并通过消除(或在最小化)重复代码和数据。这是一种方法:

from collections import OrderedDict

class MetaDefaultAsset(type):

    def __new__(cls, name, bases, namespace, **kwargs):
        clsobj = type.__new__(cls, name, bases, namespace) # create class object

        # Use "defaults" keyword argument to create __slots__ and default
        # attributes and their values.
        if 'defaults' in kwargs:
            setattr(clsobj, '__slots__', kwargs['defaults'].keys())
            for key, default_value in kwargs['defaults'].items():
                setattr(clsobj, key, default_value)

        # Define some methods to be added to class object created.
        def items(self):
            yield from ((slot, getattr(self, slot)) for slot in self.__slots__)

        def values(self):
            yield (getattr(self, slot) for slot in self.__slots__)

        # Add the above methods to the class object.
        for name, method in {'items': items, 'values': values}.items():
            setattr(clsobj, name, method)

        return clsobj


DEFAULT_ASSET_ORDERED_DICT = OrderedDict(
    [('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

class DefaultAsset(metaclass=MetaDefaultAsset,
                   defaults=DEFAULT_ASSET_ORDERED_DICT): pass

NEW_ASSETS_ORDERED_DICT = OrderedDict(
    [('computer', 1), ('monitor', 2), ('keyboard', 3), ('mouse', 4)])

class DefaultNewAsset(metaclass=MetaDefaultAsset,
                      defaults=NEW_ASSETS_ORDERED_DICT): pass


da = DefaultAsset()
print(list(da.items()))
dna = DefaultNewAsset()
print(list(dna.items()))

输出:

[('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]
[('computer', 1), ('monitor', 2), ('keyboard', 3), ('mouse', 4)]