gpt4 book ai didi

python - 如何通过类继承传递参数?

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:55 25 4
gpt4 key购买 nike

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

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)

所以,我想知道如何重写上面的类,使其成为名为 Rows 的父类,以便我可以执行以下操作:

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)]

关于python - 如何通过类继承传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com