init 属性上的函数
Function on init attribute
我需要在初始化属性之前调用一个函数,最好使用 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)
最简单的方法是使用常规 dataclass 和辅助函数,在构建 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 processing 更改值。
@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
我需要在初始化属性之前调用一个函数,最好使用 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)
最简单的方法是使用常规 dataclass 和辅助函数,在构建 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 processing 更改值。
@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