何时使用类而不是di

2024-09-27 00:14:26 发布

您现在位置:Python中文网/ 问答频道 /正文

用户数据,如下所示:

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

通过json发送到应用程序。你知道吗

在代码中的许多地方,它完成了以下操作:

user["firstName"] + " " + user["surname"]

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

def name(user):
    return user["firstName"] + " " + user["surname"]

这反过来又使我相信应该使用User类来重构代码,而不是使用name方法。你同意吗?有没有任何理由不重构代码而改用类?你知道吗


Tags: 数据代码用户nameidjson应用程序age
2条回答

我确信您在使用类时会犹豫,因为需要编写样板代码。你知道吗

但是有一个很好的图书馆可以让你的生活更轻松:^{}。你知道吗

Glyph有一个带有自述标题的帖子:The One Python Library Everyone Needs。当然,这是一篇固执己见的文章,但这里引用了它的Examples page

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

By default, all features are added, so you immediately have a fully functional data class with a nice repr string and comparison methods.

>>> 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'

字典对于存储和检索来说是很好的,但是如果你需要更多的功能,类通常是最好的选择。这样,您还可以确保设置了某些属性等

对于您的情况,如果用户的属性是只读的,我的方法实际上是使用^{}。您可以获得属性的不变性、内存效率,并且仍然可以将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

相关问题 更多 >

    热门问题