何时使用类而不是字典

时间:2016-10-02 18:24:24

标签: python

用户数据,如下:

Vehiculo

通过json发送到应用程序。

在代码的许多地方完成了以下工作:

public String getInfoDerivada(int pos){
    if(pos < 0 || pos >= cont){
        return null;
    }
    return vehiculos[pos].getInfoDerivada();
}

这让我相信应该使用一个函数:

user = {"id": 1, "firstName": "Bar", "surname": "Foosson", "age": 20}

这反过来让我相信代码应该使用user["firstName"] + " " + user["surname"] 类来重构,而不是使用def name(user): return user["firstName"] + " " + user["surname"] 方法。你是否同意并且有没有争论不重构代码来代替使用类?

2 个答案:

答案 0 :(得分:1)

我确定你因为需要编写样板代码而对使用类犹豫不决。

但是,有一个漂亮的图书馆可以让您的生活更轻松:attrs

Glyph有一个标题为自言自语的帖子:The One Python Library Everyone Needs。当然,这是一个自以为是的文章,但这里引用了Examples page

>>> @attr.s
... class Coordinates(object):
...     x = attr.ib()
...     y = attr.ib()
     

默认情况下,会添加所有功能,因此您可以立即拥有一个功能齐全的数据类,其中包含一个很好的repr字符串和比较方法。

>>> c1 = Coordinates(1, 2)
>>> c1
Coordinates(x=1, y=2)
>>> c2 = Coordinates(x=2, y=1)
>>> c2
Coordinates(x=2, y=1)
>>> c1 == c2
False

它是一个非常方便的库,所以请查看它。

以下是User课程的一个示例:

import attr

@attr.s
class User(object):

    id = attr.ib()
    firstName = attr.ib()
    surname = attr.ib()
    age = attr.ib()

    @property
    def name(self):
        return '{0.firstName} {0.surname}'.format(self)

user_dict = {'id': 1, 'firstName': 'Bar', 'surname': 'Foosson', 'age': 20}
user = User(**user_dict)
assert user.name == 'Bar Foosson'

答案 1 :(得分:1)

词典非常适合存储和检索,但如果您需要更多功能,通常可以选择上课。这样你也可以确保设置某些属性等等。

根据您的情况,如果用户的属性是只读的,我的方法实际上是使用namedtuple。您可以获得属性和内存效率的不变性,并且仍然可以将name设置为预定义的方法,就像您在类上使用property一样:

from collections import namedtuple

@property
def name(self):
    return '{} {}'.format(self.firstName, self.surname)

User = namedtuple('User', 'id firstName surname age')
User.name = name

user = User(1, 'Bar', 'Foosson', 20)
print(user.name)  # Bar Foosson

user = User(2, 'Another', 'Name', 1)
print(user.name)  # Another Name