0

我需要在初始化属性之前调用一个函数,最好使用python3.7数据类,也可以命名为元组。

这段代码做了类似的事情,属性名称只输入了一次,但是非常混乱,我不知道如何支持默认值。我确信有一种更好、更 Pythonic 的方式来做到这一点。

from collections import namedtuple

person = {
    'name': (lambda value: value.upper()),
    'age': (lambda value: value*2),
}



class Person(namedtuple("Person", person.keys())):
    def __new__(cls, **kwargs):
        return super().__new__(cls, **{k:person[k](v) for k, v in kwargs.items() if v is not None and k in person})


l = Person(**{'name': 'gesiel', 'age': 34})
print(l)
4

1 回答 1

2

最简单的方法是只使用一个常规数据类和一个辅助函数,该函数在构建Person对象之前进行转换。

@dataclass
class Person:
    age: int
    name: str

def make_person(age, name):
    return Person(age*2, name.upper())

person = make_person(100, 'patrick')
print(person.age, person.name)
# 200 PATRICK

您的另一个选择是使用Post-init 处理来更改值。

@dataclass
class Person:
    age: int
    name: str
    def __post_init__(self):
        self.age  = self.age * 2
        self.name = self.name.upper()

person = Person(100, 'patrick')
print(person.age, person.name)
# 200 PATRICK
于 2019-01-22T14:25:05.013 回答