小编Wei*_*Wei的帖子

Python 中带有子类的单例

最近,我在考虑如何用Python实现单例模式。如果 Singleton 类没有子类,下面的代码可以正常工作。

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
Run Code Online (Sandbox Code Playgroud)

但是,Singleton 类可能有子类。

class SingletonSub1(Singleton):
    def __new__(cls, *args, **kwargs):
        return super(SingletonSub1, cls).__new__(cls, *args, **kwargs)

class SingletonSub2(Singleton):
    def __new__(cls, *args, **kwargs):
        return super(SingletonSub1, cls).__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

要求是系统中只能有 1 个实例,即 Singleton、SingletonSub1 或 SingletonSub2。我怎样才能实现这个?我知道我绝对可以使用模块级变量来保存 Singleton 对象。但这确实是一个糟糕的代码......

python singleton subclass

5
推荐指数
1
解决办法
3018
查看次数

传递切片作为参数时会发生什么?

我最近遇到了切片的问题.检查以下代码:

def clean(l):
    for i in range(len(l)):
        l[i] = 0

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
clean(lst[:])
print lst
Run Code Online (Sandbox Code Playgroud)

这个代码打印出来[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].

似乎l[i] = 0函数内部没有任何效果.所以我猜Python在将一个切片传递给函数时正在制作列表的副本...然后我做了另一个测试......

def clean(l):
    for i in range(len(l)):
        print id(l[i])
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
clean(lst)
print
clean(lst[:])
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是输出结果如下:

140373225703016
140373225702992
140373225702968
140373225702944
140373225702920
140373225702896
140373225702872
140373225702848
140373225702824
140373225702800

140373225703016
140373225702992
140373225702968
140373225702944 …
Run Code Online (Sandbox Code Playgroud)

python list slice

3
推荐指数
1
解决办法
161
查看次数

标签 统计

python ×2

list ×1

singleton ×1

slice ×1

subclass ×1