填写列表python

时间:2011-12-14 18:19:24

标签: python

收看我的帖子。我猜这个社区标准可能有一个非常简单的疑问..但是如果它太简单就请原谅我。我正在努力学习python。 所以无论如何..我有一个可以有五个属性的对象。 所以,当我正在初始化类时,就像这样

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

在某处我有这个叫做get features的方法

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

所以基本上我试图将所有这些功能放入列表中。 但这是问题所在。 在初始化期间,您可以看到所有参数都是可选的。 但是当我做getFeatures时,我只想要那些被初始化的功能 现在一个天真的方式是编写一个很大的if else语句,但正如Scott Myers在书中所写的那样..任何时候你看到自己写一个代码“如果对象属于A类做某事而且如果对象属于B类做其他事情..然后打了你自己..“ getFeatures的一个好方法是什么,它只包含初始化的元素。 感谢

3 个答案:

答案 0 :(得分:6)

def getFeatures(self):
    return [field for field in (self._argA, ..., self._argE) if field is not None]

答案 1 :(得分: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'])

答案 2 :(得分:3)

所有属性都可以在对象的__dict__属性中找到,作为字典(keys->属性名称,值 - >属性值)。您可以通过列表推导过滤未初始化的变量并过滤未初始化的属性:

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]