我有一个具有可选属性(别名)的类(Cat)。如果实例创建时未提供别名属性,则该属性为空列表。效果很好,我可以创建Cat对象的实例,并将字符串追加到别名。如果我创建Cat对象的实例并仅为属性别名提供一个值,那么当我尝试附加到该对象时会收到错误消息
AttributeError: 'str' object has no attribute 'append'
。
我尝试了几种方法来使def __init__
附加单个值,但是似乎没有一个起作用。
我可以创建对象实例,然后将单个值附加到属性,但是我觉得我不明白我在做什么,所以我想探索一下它应该如何工作。
class Cat():
"""A simple attempt to model a cat."""
def __init__(self, name, alias=[], age=None):
"""Initialize name and age attributes."""
self.name = name
self.age = age
self.alias = alias
# testing default value -- my_cat
my_cat = Cat('Nat')
# appending to the alias
my_cat.alias.append('Monster')
print (my_cat.name, " ", my_cat.alias)
# prints: Nat ['Monster']
#testing with inital value -- alley_cat
alley_cat = Cat('Smelly Cat', 'smelly', 6)
##& we've set a value to alias at object creation, see if that forces alias to a string rather than a list.
alley_cat.alias.append('Stinker')
# throws error:
# alley_cat.alias.append('Stinker')
# AttributeError: 'str' object has no attribute 'append'
print (alley_cat.Name, " ", alley_cat.alias)
答案 0 :(得分:1)
这里是一个版本,可以将alias
arg作为字符串并将其放在实例化列表中。使用append_alias
方法可以将值添加到alias
列表中。您也可以以单个字符串的形式提供多个别名,并用逗号分隔值:
class Cat():
def __init__(self, name, alias=None, age=None):
self.name = name
self.age = age
if alias is None:
self.alias = []
else:
self.alias = [a.lstrip().rstrip() for a in alias.split(',')]
def append_alias(self, add_alias):
[self.alias.append(a.lstrip().rstrip())
for a in add_alias.split(',')]
my_cat = Cat('cats_name', 'alias1')
my_cat.alias
Output:
['alias1']
my_cat.append_alias('alias2, alias3')
my_cat.alias
Output:
['alias1', 'alias2', 'alias3']
my_cat.name
Output:
'cats_name'
答案 1 :(得分:0)
您可以在__init__
函数中检查别名参数的类型,如果不是,则将其包装在列表中:
if not isinstance(alias, list):
self.alias = [alias]
else:
self.alias = alias