创建具有可选列表类型属性的对象的实例

时间:2020-06-03 19:26:30

标签: python list object attributes

我有一个具有可选属性(别名)的类(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)

2 个答案:

答案 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
相关问题