2017-12-11 4 views
1

나는 12 개의 클래스가 있는데, 유일한 차이점은 DefaultAsset 글로벌 객체이다. 나는 DefaultAssetOrderedDict과 같이 DefaultAssetsOrderedDict, NewAssetsOrderedDict, OldAssetsOrderedDict 등 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)] 
관련 문제