2017-12-11 13 views
1

私はこのように見える12個のクラスがあり、唯一の違いは、DefaultAssetグローバルオブジェクトです。私は、彼らが大きく、私はそうすることが静的であることを意図している何かの複数のインスタンスにつながる疑いので、私はそれら各クラスの一部にしていなかったなどDefaultAssetsOrderedDictNewAssetsOrderedDictOldAssetsOrderedDict、として、これらのグローバルDefaultAssetOrderedDictの12を持っていますだからはどのようにクラスの継承と引数を渡すことができますか?

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) 

私が間違っている場合には(私はそれを修正するには、クラスのデータ行にOrderDictデータ行からの切り替え、メモリの問題の多くを持っていた)私を修正して、私は再することができます方法を知りたいです上記のクラスを作成してRowsという親クラスにして、私は次のようにすることができます:

または多分:

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

効果的に、私はちょうど実現し、私はスロットを使用することによって、より良いメモリの使用率とOrderedDictを実装しようとしている、私は私が制限さだと思いますクラスにオブジェクトを追加します(私はそれらをすべて事前に定義することができるので、私は必要ありません)。 OrderDictのオーバーヘッドが効果的に私はRAMの速度をトレードオフだ、それクラスの内部でその機能を模倣するグローバル変数することによって除去されています...これは理にかなっていますか?私は狂人、天才、または両方、笑ですか? – gunslingor

答えて

1

私が正しくあなたの主な目標を理解してきた場合は、排除(あるいは少なくともによって別々のクラスとメモリの節約にあなたの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)] 
関連する問題