相关疑难解决方法(0)

在Python中创建单例

这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".

我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.

最好的方法:


方法1:装饰者

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class MyClass(BaseClass):
    pass
Run Code Online (Sandbox Code Playgroud)

优点

  • 装饰器的添加方式通常比多重继承更直观.

缺点

  • 虽然使用MyClass()创建的对象将是真正的单例对象,但MyClass本身是一个函数,而不是一个类,因此您无法从中调用类方法.也是为了m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != o

方法2:基类

class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass(Singleton, …
Run Code Online (Sandbox Code Playgroud)

python singleton metaclass decorator base-class

829
推荐指数
14
解决办法
29万
查看次数

是否有一种简单,优雅的方式来定义单身人士?

似乎有很多方法可以在Python中定义单例.Stack Overflow是否有共识?

python singleton design-patterns

427
推荐指数
13
解决办法
27万
查看次数

如何避免在python中创建对象?

我是python编程的新手,我有一个类,对于这个类,我创建了一个对象(obj1).i不想创建除此对象之外的其他对象,如果有任何体想要为此类创建一个应该引用的对象到第一个对象(而不是再创建一个对象).如何做到这一点?请参考以下代码?

class MyClass:
   def __init__(self):
      pass
obj1=MyClass()//create object
obj2=MyClass()//avoid creation and refer obj2 to obj1
obj3=MyClass()//avoid creation and refer obj3 to obj1
Run Code Online (Sandbox Code Playgroud)

python python-3.x

6
推荐指数
1
解决办法
1605
查看次数

我应该使用class作为全局变量的容器

我在pygame中制作了一个简单的游戏,我意识到我需要一堆标记,数量和各种全球员工.所以我决定定义一个类并像这样使用它:

class Staff():
    def __init__(self):
        self.modes={'menu':True,'spawning':False,'sprite_change':False}
        self.timer=pygame.time.Clock()
        self.tick_count=0
Run Code Online (Sandbox Code Playgroud)

在我的游戏循环中,我只给我的所有函数一个变量:

def main_loop():
    staff=Staff()
    while not done:
        update_positions(staff)
        clear_background(staff)
        draw_sprites(staff)
Run Code Online (Sandbox Code Playgroud)

我知道这种方法很有效(对我而言),但是我想知道这会影响我游戏的速度,可能是我在做一些可怕的事情?非常感谢您的回答.

python memory global-variables

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

什么语法更适合python!=或不是?

例如:

match = re.search('...', str, re.IGNORECASE)
if match is not None:
    pass

# or
if match != None:
    pass
Run Code Online (Sandbox Code Playgroud)

什么是更好的?

python

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

在Python中,如何使用单例模式?

我的代码是:

  class Handler():

        # make it static
        from pymongo import MongoClient
        client = MongoClient("localhost", 27017)
        db = client.newsdb
        news = db.news
Run Code Online (Sandbox Code Playgroud)

我想让 client 变量成为静态变量,那么上面的代码是正确的方法吗?我也想使用单例模式,因为也许 MongoClient 是非常大的元素,当我真正需要它时我想 new() 这个元素......

我怎样才能在 python 中做到这一点?作为一个初学者,可能会问一些愚蠢的问题,提前抱歉......

python

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

SIngleton类不保留值

首先,我想说我对Python编程相当新,因此我解决问题的方法可能不正确,如果是这种情况请告诉我.

我试图使用Singleton类在我的代码中存储配置参数,并在需要时使用它.我遇到一个问题,即初始创建中存储在Singleton中的数据不会保留在对Object的后续调用中.

也许我创建Singleton对象的方式不正确,但我正在关注SO上的代码示例.

首先是我的Singleton课程

class Config(object):

    __instance = None

    dbserver = ""

    def __new__(cls):
        if cls.__instance == None:
            __instance = object.__new__(cls)
            __instance.name = "Configuration Object"
        return __instance
Run Code Online (Sandbox Code Playgroud)

这是我最初创建的Singleton实例

configurator = Config()
configurator.dbserver = dbserver
Run Code Online (Sandbox Code Playgroud)

然后我执行以下操作,dbserver属性返回空字符串.

configurator = Config()
print configurator.dbserver
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间阅读.

python singleton

0
推荐指数
1
解决办法
162
查看次数