📜  python中的数据类(1)

📅  最后修改于: 2023-12-03 15:04:36.511000             🧑  作者: Mango

Python中的数据类

在Python中,数据类是一种新的类类型,它是通过一个简单的装饰器来定义的。这个装饰器的目的是简化类定义,特别是定义只包含数据的类。以下是对Python中数据类的简单介绍。

定义数据类

数据类的定义需要使用Python内置的dataclasses模块,它提供了dataclass装饰器。例如,我们可以定义一个包含姓名和年龄的数据类Person

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

上述定义中,dataclass装饰器将类Person转换为数据类,它包含两个属性:nameage。请注意,我们没有指定任何方法,这就是数据类的一个关键特征:它只包含数据。

数据类的默认方法

在数据类中,我们可以获得默认的方法,例如构造函数、字符串表示、比较函数等。以下是使用默认方法的示例:

p1 = Person("Alice", 25)
p2 = Person("Bob", 30)

print(p1)     # Person(name='Alice', age=25)
print(p2)     # Person(name='Bob', age=30)
print(p1 == p2)      # False

上述示例展示了使用默认的字符串表示和比较函数。我们还可以使用默认的构造函数来创建数据类的实例。

自定义数据类方法

除了默认方法之外,在数据类中我们可以定义自己的方法。下面的示例展示了在Person数据类中定义say_hello方法:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

    def say_hello(self):
        print("Hello, my name is", self.name)

现在我们可以调用say_hello方法:

p = Person("Alice", 25)
p.say_hello()     # Hello, my name is Alice

请注意,say_hello方法没有返回值。

可变和不可变数据类

数据类中的属性默认是不可变的,这意味着我们无法更改属性的值。例如,尝试更改Person实例的姓名将会引发AttributeError异常:

p = Person("Alice", 25)
p.name = "Charlie"   # AttributeError: can't set attribute

但是,我们可以将数据类的属性定义为可变的。为此,我们需要使用mutable参数,如下所示:

from dataclasses import dataclass, field

@dataclass
class Point:
    x: float
    y: float
    values: list[float] = field(default_factory=list, metadata={"mutable": True})

上述定义中,values属性是一个可变列表,我们可以将其更改为任何值,例如:

p = Point(0.0, 0.0)
p.values.append(1.0)
p.values.append(2.0)
print(p.values)    # [1.0, 2.0]

但是,在定义可变数据类时,我们需要小心使用,因为它们可能会引入不确定性和不一致性。

总结

Python中的数据类是一种简单的方式来定义只包含数据的类。使用dataclass装饰器,我们可以获得默认的方法,例如构造函数、字符串表示、比较函数等。我们也可以在数据类中定义自己的方法。默认情况下,数据类中的属性是不可变的,但我们可以将它们定义为可变的。