Pau*_*jan 38 python singleton properties
我想要
Stats.singleton.twitter_count += 1
Run Code Online (Sandbox Code Playgroud)
而我以为我能做到
class Stats:
singleton_object = None
@property
@staticmethod
def singleton():
if Stats.singleton_object:
return Stats.singleton_object
Stats.singleton_object = Stats()
return Stats.singleton()
Run Code Online (Sandbox Code Playgroud)
但它引发了一个例外:
>>> Stats.singleton.a = "b"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'property' object has only read-only attributes (assign to .a)
Run Code Online (Sandbox Code Playgroud)
小智 66
就最初的问题而言,用户kaizer.se就已经开始了.我在简单性方面更进了一步,所以它现在只需要一个装饰器:
class classproperty(property):
def __get__(self, cls, owner):
return classmethod(self.fget).__get__(None, owner)()
Run Code Online (Sandbox Code Playgroud)
用法:
class Stats:
_current_instance = None
@classproperty
def singleton(cls):
if cls._current_instance is None:
cls._current_instance = Stats()
return cls._current_instance
Run Code Online (Sandbox Code Playgroud)
如上所述,这种创建单例的方式不是一个好的设计模式; 如果必须这样做,元类工厂是一个更好的方法.我对于一个阶级财产的前景感到很兴奋,所以,就是这样.
Joc*_*zel -24
单身人士在蟒蛇中毫无意义.
class A:
class_var = object()
# two objects
a, b = A(), A()
# same var everywhere
assert a.class_var is b.class_var is A.class_var
Run Code Online (Sandbox Code Playgroud)
Python的ints与简单objects不同,所以它并不总是那么简单.但就你的目的而言,这似乎已经足够了:
class Stats:
twitter_count = 0
Stats.twitter_count +=1
Stats.twitter_count +=1
assert Stats.twitter_count == 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27199 次 |
| 最近记录: |