[英]Creating a new Object returns AttributeError: 'list' object has no attribute '_sa_instance_state'
[英]Creating an instance of an object with an optional list type attribute
我有一個具有可選屬性(別名)的 class(貓)。 如果在創建實例時未提供 alias 屬性,則它是一個空列表。 這很好用,我可以為別名創建 Cat object 和 append 字符串的實例。 如果我創建 Cat object 的一個實例並且只為屬性別名提供一個值,那么當我嘗試對其進行 append 時,我會收到錯誤AttributeError: 'str' object has no attribute 'append'
我嘗試了幾種方法來讓def __init__
append 成為單個值,但這些方法似乎都不起作用。
我可以創建 object 實例,然后創建 append 屬性的單個值,但我覺得我不明白我在做什么,所以我想探索它應該如何工作。
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)
這是一個可以將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'
您可以檢查__init__
function 中的別名參數的類型,如果不是,則將其包裝在一個列表中:
if not isinstance(alias, list):
self.alias = [alias]
else:
self.alias = alias
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.