【问题标题】:Modify attributes when initializing an object with dataclasses使用数据类初始化对象时修改属性
【发布时间】:2020-09-27 21:00:03
【问题描述】:

您好,我是 Python 新手。
我以前使用过类,但没有使用过数据类。 在常规课程中,我可以通过使用其他属性来设置我的课程的属性。 并且还在初始化我的类的对象时使用函数来修改属性。

class Person:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = self.to_upper(last_name)
        self.full_name = f"{self.first_name}_{self.last_name}"

    def to_upper(self, some_string):
        return some_string.upper()

p1 = Person("john", "doe")
print(p1.first_name)
print(p1.last_name)
print(p1.full_name)

我也期望对数据类进行此操作,因为我认为数据类是常规类的改进版本。

from dataclasses import dataclass, field

@dataclass
class Person:
    first_name: str
    last_name: str = field(default_factory=to_upper)
    full_name: str = field(default_factory=get_fullname)

    def to_upper(self, some_string):
        return some_string.upper()

    def get_fullname(self, first_name, last_name):
        return f"{first_name}_{last_name}"

我在这里错过了什么?

数据类文档https://docs.python.org/3/library/dataclasses.html

【问题讨论】:

标签: python class oop python-dataclasses


【解决方案1】:

据我目前了解,__post_init__() 方法用于通过类方法初始化属性。

from dataclasses import dataclass, field

@dataclass(init=True)
class Person:
    name: str = "None"
    surname: str = "Why"

    def to_upper(self,some_string):
        return some_string.lower()

    def get_fullname(self, first_name, last_name):
        return f"{first_name}_{last_name}"

    def __post_init__(self):
        self.name: str = self.to_upper(self.name)



test = Person("Bob","Alice")

https://www.python.org/dev/peps/pep-0557/#id38

@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)

    def __post_init__(self):
        self.c = self.a + self.b

【讨论】:

  • 您好,感谢您抽出宝贵时间。是的,这看起来像我想要的东西。我还找到了@property 装饰器。但这似乎是另一回事。 ``` @dataclass class Person: first_name: str last_name: str full_name: str = "None" @property def get_fullname(self, ): return f"{self.first_name}_{self.last_name}" p = Person(" john", "doe") print(p.full_name) print(p) ```` 因为在这种情况下,我需要调用函数来获取我正在寻找的操纵值。
  • 抱歉,cmets 中的代码播放不好。但我可以使用@Property 装饰器。但这不会将我的价值设置为 init。这将需要被调用。对吗?
  • 我有同样的问题,并正在寻找验证 __post_init__ 是要走的路。文档的正确链接是:docs.python.org/3/library/dataclasses.html#post-init-processing 明确指出Among other uses, this allows for initializing field values that depend on one or more other fields
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多