如何强制实例属性始终是列表?
How to force a instance attribute to always be a list?
我有一个包含许多属性的 class。有一个属性我希望始终是 list
,即它不能被任何其他内容覆盖,并且它将始终表现得像 list
。
class SomeClass(object):
def __init__(self):
self.var1 = None
self.var2 = None
self.alwaysList = []
sc = SomeClass()
sc.alwaysList.append("Something") # Valid
sc.alwaysList = 5 # Should be invalid
我应该写包装函数吗?我应该使用 @property
吗?
您可以使用 @property
和 @alwaysList.setter
来定义设置道具时的行为。您可以在 setter 中严格执行列表类型(或测试抽象基础 class:isinstance(newVal, collections.Sequence)
),或者(可能更像 pythonic)获取任何可迭代的内容并转换为列表:
class SomeClass(object):
def __init__(self):
self.var1 = None
self.var2 = None
self._alwaysList = []
@property
def alwaysList(self):
return self._alwaysList
@alwaysList.setter
def alwaysList(self, newVal):
''' a little more forgiving of input '''
try:
self._alwaysList = list(newVal)
except TypeError:
# print warning or raise
print("alwaysList must be iterable: {} is not iterable".format(newVal))
sc = SomeClass()
sc.alwaysList.append("Something") # Valid
sc.alwaysList = 90 # error alwaysList must be iterable: 90 is not iterable
sc.alwaysList = "somthing" # string is iterable -- convert to list
sc.alwaysList # ['s', 'o', 'm', 't', 'h', 'i', 'n', 'g']
使用上面的方法更灵活——你可以传入任何可迭代的东西,比如 sc.alwaysList = range(10)
,同时仍然总是在 属性.
中有一个列表
我有一个包含许多属性的 class。有一个属性我希望始终是 list
,即它不能被任何其他内容覆盖,并且它将始终表现得像 list
。
class SomeClass(object):
def __init__(self):
self.var1 = None
self.var2 = None
self.alwaysList = []
sc = SomeClass()
sc.alwaysList.append("Something") # Valid
sc.alwaysList = 5 # Should be invalid
我应该写包装函数吗?我应该使用 @property
吗?
您可以使用 @property
和 @alwaysList.setter
来定义设置道具时的行为。您可以在 setter 中严格执行列表类型(或测试抽象基础 class:isinstance(newVal, collections.Sequence)
),或者(可能更像 pythonic)获取任何可迭代的内容并转换为列表:
class SomeClass(object):
def __init__(self):
self.var1 = None
self.var2 = None
self._alwaysList = []
@property
def alwaysList(self):
return self._alwaysList
@alwaysList.setter
def alwaysList(self, newVal):
''' a little more forgiving of input '''
try:
self._alwaysList = list(newVal)
except TypeError:
# print warning or raise
print("alwaysList must be iterable: {} is not iterable".format(newVal))
sc = SomeClass()
sc.alwaysList.append("Something") # Valid
sc.alwaysList = 90 # error alwaysList must be iterable: 90 is not iterable
sc.alwaysList = "somthing" # string is iterable -- convert to list
sc.alwaysList # ['s', 'o', 'm', 't', 'h', 'i', 'n', 'g']
使用上面的方法更灵活——你可以传入任何可迭代的东西,比如 sc.alwaysList = range(10)
,同时仍然总是在 属性.