用户数据,如下:
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"]
方法。你是否同意并且有没有争论不重构代码来代替使用类?
答案 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