收看我的帖子。我猜这个社区标准可能有一个非常简单的疑问..但是如果它太简单就请原谅我。我正在努力学习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的一个好方法是什么,它只包含初始化的元素。 感谢
答案 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]