每个新对象实例

2024-10-01 04:51:21 发布

您现在位置:Python中文网/ 问答频道 /正文

DJANGO应用程序

我有用Django发送电子邮件的接口:

from my_app.utils import com

com.mail.email_category1(subject, template, ...)
...
com.mail.email_category2(subject, template, ...)

我还有另一个互动的ie。短信:

com.sms.sms_category1(template, ...)

my_app.utils.com中定义了以下函数:

# my_app.utils.com
mail = CommunicationMail()
sms = CommunicationSms()
...

类别是上述类的方法。你知道吗

问题

是否可以每次调用CommunicationMail时都调用com.mail.email_category...的新实例?问题是每次调用都是同一个对象实例,所以当作为任务并行运行时,它们共享属性并重叠。你知道吗


Tags: django实例comapp应用程序emailmymail
2条回答

Python模块是单例的,所以它只导入一次,所以mail = CommunicationMail()只执行一次。你知道吗

您可以:

from my_app.utils import com

com.CommunicationSms().sms_category1(template, ...)

这将是建议的结构:

from my_app.utils import com
com.Mail().email_category1(template, ...)

其中my_app.utils.com是:

Mail = CommunicationMail

如果你真的想保留com.mail.email_category1符号,Python当然会让你成为动态语言 (^{} documentation):

# my_app.utils.com

class CommunicationMailFactory:
    def __getattr__(self, name):
        instance = CommunicationMail()
        return getattr(instance, name)

mail = CommunicationMailFactory()

但是使用第一种方法!你会问“为什么”。你知道吗

首先,它清楚地表明了您在做什么:您正在实例化一个新实例并调用一个方法。这对于__getattr__黑客来说并不清楚。你知道吗

第二,您可以将新实例化的实例分配给变量mail1,然后调用mail1.email_category1(subject, template, ...)或其他什么。对于__getattr__hackery,您没有这种正常的、预期的灵活性。你知道吗

相关问题 更多 >