如何创建一个返回类本身实例的静态类属性?

cod*_*r2k 2 python oop properties

我编写了一个可以处理任意精度整数的类(仅用于学习目的).该类采用整数的字符串表示形式,并将其转换BigInt为进一步计算的实例.

通常你需要数字,所以我认为如果课程可以返回这些将是有帮助的.我尝试了以下方法:

class BigInt():
    zero = BigInt("0")

    def __init__(self, value):
        ####yada-yada####
Run Code Online (Sandbox Code Playgroud)

这不起作用.错误:"名称'BigInt'未定义"

然后我尝试了以下内容:

class BigInt():

    __zero = None

    @staticmethod
    def zero():
        if BigInt.__zero is None:
            BigInt.__zero = BigInt('0')
        return BigInt.__zero


    def __init__(self, value):
        ####yada-yada####
Run Code Online (Sandbox Code Playgroud)

这实际上非常有效.我不喜欢的是,这zero是一种方法(因此必须被调用BigInt.zero()),这是违反直觉的,因为它应该只引用固定值.

所以我尝试改变zero成为一个属性,但然后写入BigInt.zero返回该类的实例property而不是BigInt因为使用了装饰器.由于类型错误,该实例不能用于计算.

有没有解决这个问题的方法?

wim*_*wim 6

静态属性......?我们将静态属性称为"属性".这不是Java,Python是一种动态类型语言,这样的构造实际上会使问题过于复杂.

只需这样做,设置一个类属性:

class BigInt: 
    def __init__(self, value): 
        ... 

BigInt.zero = BigInt("0")
Run Code Online (Sandbox Code Playgroud)

如果您希望将它完全封装在类块中,请使用类装饰器(但请注意,这只是编写相同内容的一种更奇特的方式).

def add_zero(cls):
    cls.zero = cls("0")
    return cls

@add_zero
class BigInt:
    ...
Run Code Online (Sandbox Code Playgroud)