标签: python-dataclasses

是否可以在数据类中使用*args?

我最近开始使用数据类,它们将是3.7的一个很好的补充.我很好奇是否或如何使用数据类重新创建此类的相同功能.

class Nav(object):
    def __init__(self, name:str, menu, page, *submenus):
        self.name = name
        self.menu = menu
        self.page = page
        self.submenus = submenus

foo = Nav("name", "menu", "page")
Run Code Online (Sandbox Code Playgroud)

这不起作用.提出例外TypeError: __init__() missing 1 required positional argument: 'submenus'

@dataclass
class Nav(object):
    name:str
    menu: Any
    page: Any
    submenus: tuple

foo = Nav("name", "menu", "page")
Run Code Online (Sandbox Code Playgroud)

我假设这是因为该类没有指令来解析参数. 有没有办法指示数据类装饰器需要解压缩子菜单?

python python-3.x python-dataclasses

13
推荐指数
1
解决办法
860
查看次数

Python Dataclass和属性装饰器

我一直在阅读Python 3.7的数据类作为namedtuples的替代品(我在组织中对数据进行分组时通常使用的).我想知道dataclass是否与属性装饰器兼容,以定义数据类的数据元素的getter和setter函数.如果是这样,这是在某处描述的吗?或者有可用的例子吗?

python python-3.7 python-dataclasses

13
推荐指数
7
解决办法
3889
查看次数

如何使python数据类可哈希化?

假设我在python3中有一个数据类。我希望能够哈希和排序这些对象。

我只希望它们在ID上排序/散列。

我在文档中看到,我可以只实现__hash__,但我想让datacalses为我完成工作,因为它们旨在处理此问题。

from dataclasses import dataclass, field

@dataclass(eq=True, order=True)
class Category:
    id: str = field(compare=True)
    name: str = field(default="set this in post_init", compare=False)

a = sorted(list(set([ Category(id='x'), Category(id='y')])))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Category'
Run Code Online (Sandbox Code Playgroud)

python hash python-3.x python-dataclasses

13
推荐指数
3
解决办法
3135
查看次数

如何使用Python数据类记录类的构造函数?

我有一些现有的Python 3.6代码,我想转移到Python 3.7数据类.我有一些__init__方法,包含很好的文档字符串文档,指定构造函数所采用的属性及其类型.

但是,如果我在3.7中更改这些类以使用新的Python数据类,则构造函数是隐式的.在这种情况下,如何提供构造函数文档?我喜欢数据类的想法,但如果我不得不放弃使用它们的清晰文档.

编辑澄清我目前正在使用docstrings

python documentation python-3.7 python-dataclasses

12
推荐指数
3
解决办法
2882
查看次数

数据类中的 Python 类“常量”

了解以下不是真正的常量,尝试遵循PEP 8我想在 Python 3.7 的 @dataclass 中创建一个“常量”。

@dataclass
class MyClass:
    data: DataFrame

    SEED = 8675309  # Jenny's Constant
Run Code Online (Sandbox Code Playgroud)

我的代码曾经是:

class MyClass:
    SEED = 8675309  # Jenny's Constant

    def __init__(data):
        self.data = data
Run Code Online (Sandbox Code Playgroud)

这两个在处理种子方面是等效的吗?种子现在是 init/eq/hash 的一部分吗?这些常量是否有首选样式?

python constants python-3.7 python-dataclasses

12
推荐指数
1
解决办法
2956
查看次数

如何覆盖Python数据类'asdict'方法

我有一个数据类,如下所示:

@dataclass
class myClass:
   id: str
   mode: str
   value: float
Run Code Online (Sandbox Code Playgroud)

这导致:

dataclasses.asdict(myClass)
{"id": id, "mode": mode, "value": value}
Run Code Online (Sandbox Code Playgroud)

但我想要的是

{id:{"mode": mode, "value": value}}
Run Code Online (Sandbox Code Playgroud)

我认为我可以通过to_dict向我的数据类添加一个方法来实现此目的,该方法返回所需的字典,但这不起作用。

我怎样才能得到我想要的结果?

python python-dataclasses

12
推荐指数
1
解决办法
6334
查看次数

在 dataclass(slots=True) 子类中调用 super() 时出现类型错误

我正在尝试使用slots=TruePython 3.10.5 中的数据类调用超类方法。

from dataclasses import dataclass


@dataclass(slots=True)
class Base:
    def hi(self):
        print("Hi")


@dataclass(slots=True)
class Sub(Base):
    def hi(self):
        super().hi()


Sub().hi()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误。

Traceback (most recent call last):
  File "...", line 16, in <module>
    Sub().hi()
  File "...", line 13, in hi
    super().hi()
TypeError: super(type, obj): obj must be an instance or subtype of type
Run Code Online (Sandbox Code Playgroud)

slots=True如果我从 中删除Sub,或者手动将其设为非数据类,则效果很好__slots__。如果我改为执行这些操作,错误仍然存​​在Base

Sub.__mro__(<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>)isinstance(Sub(), Base)True

python inheritance slots python-dataclasses

12
推荐指数
1
解决办法
755
查看次数

如何在 Python 3.7.x 中使用 list[customClass] 作为 @dataclass 类型

我有以下数据类。

@dataclass
class Package:
    '''Class for keeping track of one destination.'''
    _address: []

@dataclass
class Destination:
'''Class for keeping track of a destination.'''
_start: str
_end: str
_distance: float

def __init__(self, param):
    self._start = param[0]
    self._end = param[1]
    self._distance = param[2]
Run Code Online (Sandbox Code Playgroud)

以及调用上述类的以下数据类。

@dataclass
class DestinationContainer:
    '''Class for keeping track of a package destination.
       and all the possible combinations of potential next destination '''
    _package: Package
    _destinations: List[Destination]

    def __init__(self):
        pass

    def addPkg(self,param):
        self._package = param
Run Code Online (Sandbox Code Playgroud)

尝试运行程序时出现以下错误

类型错误:泛型类型的参数必须是类型。

我也尝试过_destinations这样称呼该会员。 …

oop python-3.x python-dataclasses

11
推荐指数
1
解决办法
2万
查看次数

Python:从基类数据类继承的数据类,如何将值从基类升级到新类?

如何将值从基础数据类升级到继承自它的数据类?

示例(Python 3.7.2)

from dataclasses import dataclass

@dataclass
class Person:
    name: str 
    smell: str = "good"    

@dataclass
class Friend(Person):

    # ... more fields

    def say_hi(self):        
        print(f'Hi {self.name}')

friend = Friend(name='Alex')
f1.say_hi()
Run Code Online (Sandbox Code Playgroud)

打印“嗨亚历克斯”

random_stranger = Person(name = 'Bob', smell='OK')
Run Code Online (Sandbox Code Playgroud)

返回 random_stranger "Person(name='Bob',sole='OK')"

如何将 random_stranger 变成朋友?

Friend(random_stranger)
Run Code Online (Sandbox Code Playgroud)

返回“朋友(姓名=人(姓名='鲍勃',气味='OK'),气味='好')”

结果我想得到“朋友(名字=“鲍勃”,气味=“OK”)”。

Friend(random_stranger.name, random_stranger.smell)
Run Code Online (Sandbox Code Playgroud)

有效,但如何避免必须复制所有字段?

或者我是否可能无法在从数据类继承的类上使用 @dataclass 装饰器?

python python-3.7 python-dataclasses

11
推荐指数
1
解决办法
8099
查看次数

让 Python 数据类可迭代?

我有一个数据类,我想在循环中迭代以吐出每个值。我可以__iter__()很容易地在其中写一个很短的内容,但这是我应该做的吗?我在文档中没有看到任何有关“可迭代”参数或任何内容的内容,但我只是觉得应该有......

这是我所拥有的,再次运行良好。

from dataclasses import dataclass

@dataclass
class MyDataClass:
    a: float
    b: float
    c: float

    def __iter__(self):
        for value in self.__dict__.values():
            yield value

thing = MyDataclass(1,2,3)
for i in thing:
    print(i)
# outputs 1,2,3 on separate lines, as expected
Run Code Online (Sandbox Code Playgroud)

这是最好/最直接的方法吗?

python python-dataclasses

11
推荐指数
1
解决办法
4646
查看次数