Python如何在静态方法中获取类的引用

31 浏览
0 Comments

Python如何在静态方法中获取类的引用

这个问题已经有了答案:

staticmethod和classmethod之间的区别

如何在静态方法中获取类的引用?

我有以下代码:

class A:
    def __init__(self, *args):
        ...
    @staticmethod
    def load_from_file(file):
        args = load_args_from_file(file)
        return A(*args)
class B(A):
    ...
b = B.load_from_file("file.txt")

但我希望B.load_from_file返回B类型的对象,而不是A类型的对象。

我知道如果load_from_file不是一个静态方法,我可以这样做:

def load_from_file(self, file):
        args = load_args_from_file(file)
        return type(self)__init__(*args)

admin 更改状态以发布 2023年5月23日
0
0 Comments

这就是classmethod的作用;它们与staticmethod类似,不依赖于实例信息,但它们提供有关调用它的类的信息,通过将其隐式地作为第一个参数提供。只需将您的替代构造函数更改为:

@classmethod                          # class, not static method
def load_from_file(cls, file):        # Receives reference to class it was invoked on
    args = load_args_from_file(file)
    return cls(*args)                 # Use reference to class to construct the result

当调用B.load_from_file时,cls将是B,即使该方法在A上定义,确保您构造正确的类。

通常情况下,每当您发现自己编写这样的替代构造函数时,您都需要一个classmethod来正确启用继承。

0