相关疑难解决方法(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万
查看次数

Flask:如何在蓝图中使用应用程序上下文?

我正在学习烧瓶和蟒蛇,并且不能围绕一个典型的烧瓶应用程序需要构建的方式.

我需要从内部蓝图访问应用程序配置.像这样的东西

#blueprint.py
from flask import Blueprint

sample_blueprint = Blueprint("sample", __name__)

# defining a route for this blueprint
@sample_blueprint.route("/")
def index():
     # !this is the problematic line
     # need to access some config from the app
     x = app.config["SOMETHING"]
     # how to access app inside blueprint?
Run Code Online (Sandbox Code Playgroud)

如果在蓝图中导入app是解决方案,这不会导致循环导入吗?即在应用程序中导入蓝图,在蓝图中导入应用程序?

design-patterns flask

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

“蓝图”对象没有属性“配置”

我正在使用烧瓶邮件。但是当我在 Flask 邮件的前端(react.js)调用其余 api 时,我收到此错误

“蓝图”对象没有属性“配置”

这是我的烧瓶邮件代码

from flask import Flask,Blueprint
from flask_mail import Mail, Message

app = Blueprint('app', __name__)
app.register_blueprint(url_prefix='/api/v1/SalesLead')
mail=Mail(app)

app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'myvar30@gmail.com'
app.config['MAIL_PASSWORD'] = '*****'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(leadHistoryController)

@app.route("/")
def index():
   msg = Message('Sheraspace', sender = 'myvar30@gmail.com', recipients = ['jobaer.jhs@gmail.com'])
   msg.body = "Hello jh"
   mail.send(msg)
   return "Sent again"

if __name__ == '__main__':
   app.run(debug = True)
Run Code Online (Sandbox Code Playgroud)

蓝图配置有什么解决办法吗?或者我可以在前端使用其余的 api 而不使用蓝图吗?

flask flask-mail reactjs

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