2011-12-14 75 views
1

謝謝你看我的帖子。我想我對這個社區標準可能有一個相當簡單的懷疑......但如果它太簡單,請原諒我。我正在學習python。 所以無論如何..我有一個對象,可以有五個屬性。 因此,讓當我初始化類的說,它是這樣填寫一個列表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的時候,我只想要那些被初始化的特性。 現在一種天真的方式是寫一個大的if else語句,但是Scott Myers寫的是書..任何時候你看到自己寫一個代碼「如果對象是A型做某件事,如果對象是B型做別的事情......然後打你的自己......」 getFeatures的一個好方法是隻包含whcih被初始化的元素。 由於

回答

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(self): 
    return [elem for elem in self.__dict__.values() if elem != None] 

您可能還需要收集與某種類型的屬性,如字符串("str"),整數("int")等:

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] 
:您可以通過列表理解和過濾初始化屬性過濾未初始化的變量