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

标签 python oop properties

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

通常您需要数字,所以我认为如果类可以返回这些数字会很有帮助。我尝试了以下方法:

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

    def __init__(self, value):
        ####yada-yada####

这行不通。错误:“未定义名称‘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####

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

所以我尝试将 zero 更改为属性,但随后编写 BigInt.zero 返回类 property 的实例而不是 BigInt 因为使用了装饰器。由于类型错误,该实例无法用于计算。

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

最佳答案

静态属性...?我们称静态属性为“属性”。这不是 Java,Python 是一种动态类型的语言,这样的构造确实会使事情过于复杂。

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

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

BigInt.zero = BigInt("0")

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

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

@add_zero
class BigInt:
    ...

关于python - 如何创建一个返回类本身实例的静态类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54520553/

相关文章:

python - 没有名为 rest_authusers 的模块错误

c# - 在 Visual Studio 中制作属性代码片段

python - 什么是惰性属性(property)?

c# - 基类中 protected 静态属性是否是在派生类之间共享数据的良好做法?

python - 在SQLAlchemy中使用别名作为列名

Python 相当于 zip 的字典

python - 使用 Django 时如何在命令行中退出 dbshel​​l (SQLite 3)?

javascript - 如何在 JavaScript 中动态命名和创建对象?

python - 如何在 Tkinter 窗口上使用 for 循环创建多个框架?

python - 设计类结构的方法