2011-12-14 8 views
1

私のポストを探しています。私はおそらく、このコミュニティの標準によっておそらくかなり簡単な疑いがあると思います。しかし、あまりに単純であれば私を許してください。私はPythonを学ぼうとしています。 とにかく私は5つの属性を持つことができるオブジェクトを持っています。 だからその本リストを埋めるpython

class Foo: 
    def __init__ (self, argA = None, argB = None, argC = None, argD = None....) 

とどこかのように私は基本的に、私はリストにこれらすべての機能を置くしようとしているのget機能

def getFeatures(self): 
    x = [self._argA, self._argB, self._argc... and so on] 

と呼ばれるこの方法を持っている私は、クラスを初期化していたときに言うことができます。 しかし、ここに問題があります。 初期化中は、すべてのパラメータがオプションであることがわかります。 getFeaturesを実行すると、初期化された機能のみが必要です Scott Myerが書いたように、あなたがコードを書いているといつでも見ることができます。 "オブジェクトがタイプAで何かを行い、オブジェクトがタイプBなら何か他のことをして...あなたの自己をスラップします" getFeaturesだけが含まれています要素は初期化されます。 おかげ

答えて

5

機能名の辞書を有効/無効にします。これは、これらの変数をすべて浮かべるよりはるかに優れています。

def __init__(self, **kwargs): 
    self.features = kwargs 

def getFeatures(self): 
    return {feature for feature, isEnabled in self.features.items() if isEnabled} 

例:

>>> class Foo(object): 
...  def __init__(self, **kwargs): 
...    self.features = kwargs 
...  
...  def getFeatures(self): 
...    return {feature for feature, isEnabled in self.features.items() if isEnabled} 
... 
>>> x = Foo(red=True, yellow=False, green=True) 
>>> x.getFeatures() 
set(['green', 'red']) 
6
def getFeatures(self): 
    return [field for field in (self._argA, ..., self._argE) if field is not None] 
3

辞書としてすべての属性は、オブジェクトの属性__dict__で見つけることができます(キー - >名前、値 - 属性>は属性値)。

def get_initialized_attrs_bytype(self, type_name): 
    return [elem for elem in self.__dict__.values() \ 
        if elem != None and type(elem).__name__ == type_name] 
ます。また、このような文字列( "str"を)などの特定のタイプの属性を収集することをお勧めします

def get_initialized_attrs(self): 
    return [elem for elem in self.__dict__.values() if elem != None] 

、整数("int")等::あなたはリスト内包とフィルタリング初期化されていない属性によって初期化されていない変数をフィルタリングすることができます

関連する問題