使用类型定义列表

时间:2009-12-17 20:46:00

标签: python

我来自Java,我想做一些这样的data transfer objects(DTO):

class ErrorDefinition():
    code = ''
    message = ''
    exception = ''

class ResponseDTO():
    sucess = True
    errors = list() # How do I say it that it is directly of the ErrorDefinition() type, to not import it every time that I'm going to append an error definition?

或者有更好的方法吗?

7 个答案:

答案 0 :(得分:5)

Python是动态类型的,你只是不像在Java中那样为变量声明类型。在此阶段强烈建议您阅读The official tutorial

答案 1 :(得分:1)

  

errors = list()#我怎么说它直接是ErrorDefinition()类型,每次我要附加一个错误定义时都不导入它?

我不确定你在这篇评论中想说的是什么,但如果我理解正确,最好的方法就是定义一个添加错误的方法。

class ResponseDTO(object): # New style classes are just better, use them.

    def __init__(self):
        self.success = True # That's the idiomatic way to define an instance member.
        self.errors = [] # Empty list literal, equivalent to list() and more idiomatic.

    def append_error(self, code, message, exception):
        self.success = False
        self.errors.append(ErrorDefinition(code, message, exception))

答案 2 :(得分:0)

我很确定你无法为列表定义类型。您每次都需要导入ErrorDefinition(看起来像现有的Exception类)。

答案 3 :(得分:0)

DTO是Java的设计模式。尝试在Python中使用Java语义是行不通的。你需要走出另一个级别然后问。这是我试图解决的问题......在Java中我会使用DTO - 你会如何使用Python来处理它?<​​/ p>

答案 4 :(得分:0)

请通过“每次导入”来解释你的意思。

在您准确探究它们的作用之前,您需要重新考虑使用类级属性,尤其是在使用列表等可变类型时。考虑一下:

>>> class Borg(object):
...     alist = list()
...
>>> a = Borg()
>>> b = Borg()
>>> a.alist.append('qwerty')
>>> a.alist
['qwerty']
>>> b.alist
['qwerty']
>>>

不是你想要的?使用通常的Python习惯用法在类的__init__方法中设置所需的内容:

>>> class Normal(object):
...     def __init__(self):
...         self.alist = list()
...
>>> x = Normal()
>>> y = Normal()
>>> x.alist.append('frobozz')
>>> x.alist
['frobozz']
>>> y.alist
[]
>>>

答案 5 :(得分:0)

您现在可以使用type hint通过从__init__函数中指定类型来实现。举一个简单的例子:

class Foo:
    def __init__(self, value: int):
        self.value = value


class Bar:
    def __init__(self, values: List[Foo]):
        self.values = values

有了这个,我们知道values的{​​{1}}应该保存对Bar的引用列表; Foo中的value应该是整数。让我们看看当我们错误地使用它时拥有什么:

Foo

答案 6 :(得分:0)

您可以将列表输入为python 3.8.4

https://docs.python.org/3/library/typing.html

from typing import List
Vector = List[float]

Python是动态输入的,但是https://www.python.org/dev/peps/pep-0484/ 键入使读取代码,理解代码,有效使用IDE工具和创建更高质量的软件变得更加容易。我想这就是它在PEP中的原因。