Python相当于Scala案例类

jam*_*ndu 9 python scala

是否有任何Python相当于Scala的Case Class?就像自动生成构造函数一样,无需写出样板文件即可分配给字段.

Bri*_*hon 22

目前,现代的方法(从Python 3.7开始)是一个数据类.例如,Scala case class Point(x: Int, y: Int)变为:

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int
Run Code Online (Sandbox Code Playgroud)

frozen=True部分是可选的; 你可以省略它来获得一个可变数据类.我把它包含在Scala的案例类中.

在Python 3.7之前,有collections.namedtuple:

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
Run Code Online (Sandbox Code Playgroud)

Namedtuples是不可变的,因为它们是元组.如果要添加方法,可以扩展namedtuple:

class Point(namedtuple('Point', ['x', 'y'])):
    def foo():
        pass
Run Code Online (Sandbox Code Playgroud)

  • @ecoe 我不知道镜头,但你可以随时发布另一个问题来找出答案。 (2认同)

pra*_*upd 5

如果使用,则将python3.7数据类作为@dataclass。官方文档在这里-30.6。数据类-数据类

from dataclasses import dataclass

@dataclass
class CustomerOrder(object):
  order_id: int
  customer_id: str
  item_name: str

order = CustomerOrder(1, '001', 'Guitar')
print(order)
Run Code Online (Sandbox Code Playgroud)

确保将python3升级到python 3.7。

在macOS中: brew upgrade python3

虽然以上scala中的数据类看起来像,

scala> final case class CustomerOrder(id: Int, customerID: String, itemName: String)
defined class CustomerOrder
Run Code Online (Sandbox Code Playgroud)