Python 初学者:AttributeError:“列表”对象没有属性

问题描述 投票:0回答:4

错误提示:

AttributeError: 'list' object has no attribute 'cost' 

我正在尝试使用以下类来处理自行车字典来进行简单的利润计算:

class Bike(object):
    def __init__(self, name, weight, cost):
        self.name = name
        self.weight = weight
        self.cost = cost

bikes = {
    # Bike designed for children"
    "Trike": ["Trike", 20, 100],
    # Bike designed for everyone"
    "Kruzer": ["Kruzer", 50, 165]
    }

当我尝试使用 for 语句计算利润时,出现属性错误。

# Markup of 20% on all sales
margin = .2
# Revenue minus cost after sale
for bike in bikes.values():
    profit = bike.cost * margin

首先,我不知道为什么它指的是一个列表,一切似乎都被定义了,不是吗?

python list class dictionary attributeerror
4个回答
26
投票

考虑:

class Bike(object):
    def __init__(self, name, weight, cost):
        self.name = name
        self.weight = weight
        self.cost = cost

bikes = {
    # Bike designed for children"
    "Trike": Bike("Trike", 20, 100),      # <--
    # Bike designed for everyone"
    "Kruzer": Bike("Kruzer", 50, 165),    # <--
    }

# Markup of 20% on all sales
margin = .2
# Revenue minus cost after sale
for bike in bikes.values():
    profit = bike.cost * margin
    print(profit)

输出:

33.0
20.0

不同之处在于,在您的

bikes
字典中,您将值初始化为列表
[...]
。相反,您的代码的其余部分似乎需要
Bike
实例。因此,创建
Bike
实例:
Bike(...)

至于你的错误

AttributeError: 'list' object has no attribute 'cost'

当您尝试在

.cost
对象上调用
list
时,就会发生这种情况。非常简单,但我们可以通过查看您调用
.cost
的位置来弄清楚发生了什么——在这一行中:

profit = bike.cost * margin

这表明至少有一个

bike
(即
bikes.values()
的成员是一个列表)。如果您查看定义
bikes
的位置,您会发现这些值实际上是列表。所以这个错误是有道理的。

但是由于 your class 有一个成本属性,看起来你正在尝试使用

Bike
实例作为值,所以我做了一点改变:

[...] -> Bike(...)

一切准备就绪。


6
投票

它们是列表,因为您在字典中将它们键入为列表:

bikes = {
    # Bike designed for children"
    "Trike": ["Trike", 20, 100],
    # Bike designed for everyone"
    "Kruzer": ["Kruzer", 50, 165]
    }

你应该使用自行车类:

bikes = {
    # Bike designed for children"
    "Trike": Bike("Trike", 20, 100),
    # Bike designed for everyone"
    "Kruzer": Bike("Kruzer", 50, 165)
    }

这将允许您通过 bike.cost 获得自行车的成本,正如您所尝试的那样。

for bike in bikes.values():
    profit = bike.cost * margin
    print(bike.name + " : " + str(profit))

现在将打印:

Kruzer : 33.0
Trike : 20.0

5
投票

在使用之前,您需要将字典的值传递到

Bike
构造函数中。或者,请参阅
namedtuple
- 似乎更符合您想要做的事情。


0
投票

从 gettext 导入安装 从系统导入argv 导入nmap

创建 escaneo 对象

扫描仪 = nmap.PortScanner()

主机 = argv.主机

验证主机有效

如果不是主持人: print("输入主机。") 尝试: # 允许在港口范围内使用 begin = int(input("波多黎各首字母:")) - 1 结束=1023

    mensaje = f"Escaneando {host}  puerto {begin} al {end}...\n"
    print(mensaje)
    
    # Almacenar los resultados en el archivo
    with open ("nombre_archivo", 'w') as archivo:
        archivo.write("\n" + "*" * 50 + "\n")
        archivo.write(mensaje)

    for i in range (begin, end + 1):
        res = scanner.scan (host, str(i))
        estado_puerto = res['scan'][host]['tcp'][i]['state']

        # Si el puerto está abierto, obtener datos
        servicio = res['scan'][host]['tcp'][i].get('nombre', 'desconocido')
        resultado = f'Puerto ({i+1}) está {estado_puerto}. Servicio: {servicio}\n'
        print(resultado)
        archivo.write(resultado)

except KeyboardInterrupt:
    print("\nEscaneo cancelado por el usuario.")
    exit()
© www.soinside.com 2019 - 2024. All rights reserved.