python3中@dataclasses.dataclass如何在python2用
时间: 2024-03-09 14:44:38 浏览: 144
Python3.7 新特性之dataclass装饰器
在 Python 2 中没有 `dataclasses` 模块,因此不能使用 `@dataclasses.dataclass` 装饰器。但是,可以使用 Python 2 中的 `typing.NamedTuple` 来实现类似的功能。下面是一个使用 `typing.NamedTuple` 实现类似 `dataclass` 的例子:
```python
import typing
def dataclass(cls):
fields = []
defaults = {}
for k, v in cls.__annotations__.items():
fields.append(k)
if hasattr(v, "__args__") and v.__args__[0] is typing.Union:
defaults[k] = None
else:
defaults[k] = v()
def __new__(cls, *args, **kwargs):
if len(args) > len(fields):
raise TypeError("Too many arguments")
values = defaults.copy()
for i, arg in enumerate(args):
values[fields[i]] = arg
for k, v in kwargs.items():
if k not in fields:
raise TypeError("Unexpected keyword argument: {}".format(k))
values[k] = v
return super(cls, cls).__new__(cls, **values)
cls.__new__ = staticmethod(__new__)
return cls
```
使用方法与 `@dataclasses.dataclass` 相同,例如:
```python
@dataclass
class Person:
name: str
age: int
gender: str = 'unknown'
p = Person('John', 30)
print(p.name) # John
print(p.age) # 30
print(p.gender) # unknown
```
阅读全文