【问题标题】:Class in list comprehension has no attribute列表理解中的类没有属性
【发布时间】:2021-04-23 23:09:52
【问题描述】:

当我在列表理解中打印该类时,它说它没有属性“名称”,但它显然有。另外,如果我为一个设置名称,它会为所有设置名称,就好像它们都是同一个类一样?

class A(object):
    def __init__(self, name):
        if name:
            self.name = name
        else:
            self.name = "no name"

    def __repr__(self):
        return self.name
                        
all_a = [A for i in range(5)]
other_a = []
    
for i in range(5):
    name = " name " + str(i)
    a = A(name)
    other_a.append(a)

print(all_a)

for a in all_a:
    print(a)
    print(a.name)

all_a[0].name = "all a zero"
all_a[1].name = "all a one"

for a in all_a:
    print(a)
    print(a.name)
        
for a in other_a:
    print(a)

如果我删除 name 参数,它仍然会崩溃:

class A(object):
    def __init__(self):
        self.name = "no name"

    def __repr__(self):
        return self.name
                        
all_a = [A for i in range(5)]
other_a = []
    
for i in range(5):
    name = " name " + str(i)
    a = A()
    other_a.append(a)

print(all_a)

for a in all_a:
    print(a)
    print(a.name)

all_a[0].name = "all a zero"
all_a[1].name = "all a one"

for a in all_a:
    print(a)
    print(a.name)
        
for a in other_a:
    print(a)

【问题讨论】:

    标签: python-3.x list class attributes list-comprehension


    【解决方案1】:

    问题在于这一行没有初始化对象:

    all_a = [A for i in range(5)]
    

    需要改成这样的:

    all_a = [A(str(i)) for i in range(5)]
    

    另一种选择是将name 声明为类属性:

    class A(object):
    
        name = "Undefined"
    
        def __init__(self, name):
            if name:
                self.name = name
            else:
                self.name = "no name"
    
        def __repr__(self):
            return self.name
    
    all_a = [A for i in range(5)]
    
    for a in all_a:
        print(a)
        print(a.name)
    

    输出:

    <class '__main__.A'>
    Undefined
    <class '__main__.A'>
    Undefined
    <class '__main__.A'>
    Undefined
    <class '__main__.A'>
    Undefined
    <class '__main__.A'>
    Undefined
    

    【讨论】:

    • 但如果我去掉 name 参数,它仍然会发生 - 我编辑了帖子以显示这一点。
    • 还是一样的问题,name直到对象初始化才存在。也许您打算在第二个代码块的第 18 行迭代 other_a
    • 是的,你需要一个类属性 name="no name" 和 init 方法中的条件可能不需要,只需要 self.name = name
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多