我最近开始使用数据类,它们将是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 3.7的数据类作为namedtuples的替代品(我在组织中对数据进行分组时通常使用的).我想知道dataclass是否与属性装饰器兼容,以定义数据类的数据元素的getter和setter函数.如果是这样,这是在某处描述的吗?或者有可用的例子吗?
假设我在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 3.6代码,我想转移到Python 3.7数据类.我有一些__init__方法,包含很好的文档字符串文档,指定构造函数所采用的属性及其类型.
但是,如果我在3.7中更改这些类以使用新的Python数据类,则构造函数是隐式的.在这种情况下,如何提供构造函数文档?我喜欢数据类的想法,但如果我不得不放弃使用它们的清晰文档.
编辑澄清我目前正在使用docstrings
了解以下不是真正的常量,尝试遵循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 的一部分吗?这些常量是否有首选样式?
我有一个数据类,如下所示:
@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向我的数据类添加一个方法来实现此目的,该方法返回所需的字典,但这不起作用。
我怎样才能得到我想要的结果?
我正在尝试使用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
我有以下数据类。
@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这样称呼该会员。 …
如何将值从基础数据类升级到继承自它的数据类?
示例(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 装饰器?
我有一个数据类,我想在循环中迭代以吐出每个值。我可以__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)
这是最好/最直接的方法吗?