使用 class 属性实现类似单例的 class 是一种好习惯吗?
Is it a good practice to implement a singleton-like class using class attributes?
我有一个 class,其中包含一些 variables/states。
我想在我的代码中与许多其他 classes 共享这些状态。
我在网上看了看,发现模块和单例 classes 是一个很好的方法。我最终创建了一个 class 并将所有数据存储为 class 属性并通过 class 本身访问它,如示例:
# foo.py
class Foo(object):
varx=45
def foo(x):
Foo.varx = x
我会将数据导入为:
# bar.py
from foo import Foo
print(Foo.varx) #45
Foo.foo(5)
print(Foo.varx) #5
我想知道像这样使用 classes 属性是否是一种反模式,或者是否存在我在此实现中没有看到的缺点。
由于您的 foo
方法正在改变 class Foo
的状态(而不是任何 instance of Foo
), 在这种情况下使用 classmethod
会更 pythonic。另外,请注意,没有必要显式继承自 object
,因为所有 python classes 都隐式继承自 object
.
class Foo:
varx = 45
@classmethod
def foo(cls, x):
cls.varx = x
您当前的 foo
方法实现已将 class 的名称硬编码到实现中,这意味着如果您更改 class 的名称,该实现将中断.如果您有另一个 class 继承自 Foo
,您希望能够实现 Foo
的方法,那么实现也会中断,因为 class 继承自 [=12] =] 会有不同的名称。
我有一个 class,其中包含一些 variables/states。 我想在我的代码中与许多其他 classes 共享这些状态。 我在网上看了看,发现模块和单例 classes 是一个很好的方法。我最终创建了一个 class 并将所有数据存储为 class 属性并通过 class 本身访问它,如示例:
# foo.py
class Foo(object):
varx=45
def foo(x):
Foo.varx = x
我会将数据导入为:
# bar.py
from foo import Foo
print(Foo.varx) #45
Foo.foo(5)
print(Foo.varx) #5
我想知道像这样使用 classes 属性是否是一种反模式,或者是否存在我在此实现中没有看到的缺点。
由于您的 foo
方法正在改变 class Foo
的状态(而不是任何 instance of Foo
), 在这种情况下使用 classmethod
会更 pythonic。另外,请注意,没有必要显式继承自 object
,因为所有 python classes 都隐式继承自 object
.
class Foo:
varx = 45
@classmethod
def foo(cls, x):
cls.varx = x
您当前的 foo
方法实现已将 class 的名称硬编码到实现中,这意味着如果您更改 class 的名称,该实现将中断.如果您有另一个 class 继承自 Foo
,您希望能够实现 Foo
的方法,那么实现也会中断,因为 class 继承自 [=12] =] 会有不同的名称。