2011-12-14 78 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] 
:您可以通过列表理解和过滤初始化属性过滤未初始化的变量