使用GPT4辅助创作
类默认方法
init
__init__
方法是Python类中的一个无法绕开的方法。它相当于面向对象方法中的 C++ 构造函数。当你创建一个类的新对象时,Python 会自动将你的参数传递给 init 方法并调用它来初始化对象的属性。init 方法让类初始化对象的属性,没有其他作用,它只在类中使用。
__enter__
&&__exit__
当with语句在开始运行时,会在上下文管理器对象上调用 __enter__
方法。with语句运行结束后,会在上下文管理器对象上调用 exit 方法
类默认属性
slots
Python是动态语言,对于普通的类,可以为类实例赋值任何属性,这些属性会存储在dict 中,但数据通过字典(Hash)存储所占用的空间较大,效率较低,slots 属性的出现就是为了解决上述问题。slots 属性的作用是声明并限定类成员,并拒绝类创建dict 和weakref 属性以节约内存空间。
参考资料:
各种类
抽象类
需要引入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__
方法,该方法接受三个参数:name
、source
、create_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
,如果 g1
和 g2
的 name
、source
和 create_fn
属性都相同,否则返回 False
。
总的来说,@dataclasses.dataclass
可以帮助你减少样板代码,并使你的类更简洁和易于理解。
classmethod
在 Python 中,classmethod
是一种特殊类型的方法,它在调用时,其第一个参数是类本身,而不是类的实例。这种方法的标志是它的第一个参数通常被命名为 cls
,以区别于通常的实例方法的第一个参数 self
。
classmethod
的主要作用是:
-
工厂方法:
classmethod
能够返回类的实例。这使得它们可以作为工厂方法使用,返回类的不同实例。例如,你可能有一个日期类,有一个classmethod
可以接受多种日期格式,并返回相应的日期类实例。 -
继承:
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
,而不是实例变量。