【问题标题】:How to use a list of classes as a function parameter?如何使用类列表作为函数参数?
【发布时间】:2020-10-07 15:19:54
【问题描述】:

在使用 C# 几年后,我正在学习 python(3)。因此,我正在用 python 编写一些家庭项目,但我遇到了一些我似乎无法弄清楚如何在 python 中执行的问题。

假设我有一个像这样的简单类:

class SomeItem:
    def __init__(self, var1, var2, var3):
        # Instance Variable
        self.var1= var1
        self.var2= var2
        self.var3 = var3

在我的代码中的某个时刻,我使用这个类将一堆它们放在一个列表中;

list_of_SomeItems = []
list_of_SomeItems.append(SomeItem("apple","banana", "pear"))
list_of_SomeItems.append(SomeItem("fruit","candy", "drinks"))
# so on and so forth
return list_of_SomeItems

但现在是我似乎无法弄清楚的部分 在某个时候,我想创建一个函数来获取这些SomeItems 的列表并使用 is 进行处理。

def name_of_function(interval=1.0, someItemsList):
    for item in someItemsList:
        print(item.var1)

但显然此时它不知道item 有一个var1,因为我没有告诉函数列表必须是SomeItem 对象。

在我的函数中声明列表并将该参数与类关联的正确方法是什么?

编辑 固定的; 正如@chepner 和@Perfect 提到的,错误是可选参数被放在了第一位(普通语法错误);修复该错误后;它按预期工作。

【问题讨论】:

  • csvList 定义在哪里?
  • 您从未创建过SomeItem 的任何实例。此代码应生成TypeError,因为list.append 不接受多个参数。
  • list_of_SomeItems.append(SomeItem("apple", "banana", "pear"))
  • Python 是动态类型的;你没有告诉函数item 有一个特殊的类型。如果item.var1 能成功,它就会成功。
  • def name_of_function(interval=1.0, someItemsList):的定义行中,关键字参数应该跟在位置参数之后。所以这就像def name_of_function(someItemsList, interval=1.0

标签: python list class


【解决方案1】:

修复语法错误后,代码将按原样运行。

Python 是动态类型的,你可以试试foo.bar,如果foobar 属性,它就会成功,如果没有,它只会引发一个AttributeError,你可以用它来捕捉except 继续前进。

【讨论】:

    【解决方案2】:

    如果你是python 3.5及以上版本,你可以使用typing模块来传递参数的数据类型。您可以通过以下方式执行此操作:

    from typing import List
    
    class Item:
        def __init__(self, var1: str, var2: str, var3: str):
            self.var1: str = var1
            self.var2: str = var2
            self.var3: str = var3
    
    itemlist = [Item("apple","banana", "pear"),Item("fruit","candy", "drinks")]
    

    函数从 Item 类实例列表中返回 var1

    def get_var_one(items: List[Item])-> List[str]:
        return [elem.var1 for elem in items]
    

    您可以使用库 mypy 对您的代码执行静态类型检查。

    【讨论】:

      【解决方案3】:

      此时它不知道该项目有 var1,因为我没有告诉函数列表必须是 SomeItem 对象。

      这很可能是设计问题。当你创建一个事物列表时,它们通常应该有一些共同点——这就是为什么它们在同一个列表中。如果您稍后要尝试访问该属性,为什么要将没有var1 属性的项目放在列表中?

      可以创建异构列表并使用条件代码和异常处理,但它往往反映了设计中的混乱。

      【讨论】:

      • 我以为python不知道;但似乎python确实如此;我假设的原因是我使用 c# 已经好几年了,你需要真正明确地声明它 'list someItemsList' 似乎我对 python 的假设是完全错误的
      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 2011-06-26
      • 2020-07-13
      • 2019-01-29
      • 2023-01-30
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多