Python中的类

使用GPT4辅助创作

类默认方法

init

__init__ 方法是Python类中的一个无法绕开的方法。它相当于面向对象方法中的 C++ 构造函数。当你创建一个类的新对象时,Python 会自动将你的参数传递给 init 方法并调用它来初始化对象的属性。init 方法让类初始化对象的属性,没有其他作用,它只在类中使用。

__enter__ &&__exit__

当with语句在开始运行时,会在上下文管理器对象上调用 __enter__ 方法。with语句运行结束后,会在上下文管理器对象上调用 exit 方法

类默认属性

slots

Python是动态语言,对于普通的类,可以为类实例赋值任何属性,这些属性会存储在dict 中,但数据通过字典(Hash)存储所占用的空间较大,效率较低,slots 属性的出现就是为了解决上述问题。slots 属性的作用是声明并限定类成员,并拒绝类创建dictweakref 属性以节约内存空间。

参考资料:

各种类

抽象类

需要引入abc,使用abstractmethod 指定该函数必须被子类实现

from abc import ABCMeta, abstractmethod class Model(metaclass=ABCMeta): @abstractmethod def load(self, model_dict): pass @abstractmethod def forward(self, maxbytes=-1) : pass

静态类 staticmethod

dataclass 数据类

在 Python 中,@dataclasses.dataclass 是一个装饰器,用于自动添加特殊方法(如 __init____repr____eq__ 等)到类中,以减少样板代码。这是 Python 3.7 版本中添加的一个新特性。

对于你的例子,定义如下:

@dataclasses.dataclass
class Guard:
    name: str
    source: GuardSource
    create_fn: Callable

当你用 @dataclasses.dataclass 装饰 Guard 类时,Python 会自动为你添加一些方法。

例如,它会自动创建一个 __init__ 方法,该方法接受三个参数:namesourcecreate_fn。这意味着你可以创建一个新的 Guard 实例,如 g = Guard("guard_name", GuardSource, create_function),而不需要手动定义 __init__ 方法。

它还会自动添加 __repr__ 方法,用于提供对象的字符串表示。如果你打印一个 Guard 对象,如 print(g),Python 会显示如下内容:“Guard(name='guard_name', source=GuardSource, create_fn=<function create_function at 0x7fbd243e6950>)”。

此外,@dataclasses.dataclass 还会自动添加 __eq__ 方法,用于比较两个 Guard 对象是否相等。g1 == g2 将返回 True,如果 g1g2namesourcecreate_fn 属性都相同,否则返回 False

总的来说,@dataclasses.dataclass 可以帮助你减少样板代码,并使你的类更简洁和易于理解。

classmethod

在 Python 中,classmethod 是一种特殊类型的方法,它在调用时,其第一个参数是类本身,而不是类的实例。这种方法的标志是它的第一个参数通常被命名为 cls,以区别于通常的实例方法的第一个参数 self

classmethod 的主要作用是:

  1. 工厂方法classmethod 能够返回类的实例。这使得它们可以作为工厂方法使用,返回类的不同实例。例如,你可能有一个日期类,有一个 classmethod 可以接受多种日期格式,并返回相应的日期类实例。

  2. 继承classmethod 可以被子类继承和覆盖,这使得它们在创建继承层次结构时非常有用。你可以创建一个 classmethod 来处理与类本身有关的任务,然后在子类中覆盖这个方法来提供特定于子类的功能。

下面是一个 classmethod 的使用例子:

class MyClass:
    count = 0

    def __init__(self):
        MyClass.count += 1

    @classmethod
    def instance_count(cls):
        return cls.count


# 创建实例
a = MyClass()
b = MyClass()

# 使用classmethod
print(MyClass.instance_count())  # 输出:2

在这个例子中,instance_count 是一个 classmethod,它返回了类 MyClass 已经创建的实例数。请注意,即使我们没有创建 MyClass 的实例,我们也能调用 instance_count。并且,instance_count 方法在内部访问的是类变量 count,而不是实例变量。