每次调用都有新对象实例

时间:2016-07-14 18:55:55

标签: python django

DJANGO APP

我有在Django中发送电子邮件的界面:

# Delete PrivateHeaders folder
rm -rf ${TARGET_BUILD_DIR}/${PRODUCT_NAME}${WRAPPER_SUFFIX}/PrivateHeaders

# Remove module.modulemap file
rm ${TARGET_BUILD_DIR}/${PRODUCT_NAME}${WRAPPER_SUFFIX}/Modules/module.modulemap

# Copy public.modulemap file and rename it to module.modulemap
cp ${SRCROOT}/test/public.modulemap ${TARGET_BUILD_DIR}/${PRODUCT_NAME}${WRAPPER_SUFFIX}/Modules/module.modulemap

# Append the Swift module so you can access you Swift code in Objective-C via @import MyFramework.Swift
echo "module ${PRODUCT_NAME}.Swift { header \"${PRODUCT_NAME}-Swift.h\" }" >> ${TARGET_BUILD_DIR}/${PRODUCT_NAME}${WRAPPER_SUFFIX}/Modules/module.modulemap

我还有另一个ie的interfces。对于短信:

from my_app.utils import com

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

com.sms.sms_category1(template, ...) 中定义了函数:

my_app.utils.com

和类别是上述类的方法。

问题

每次拨打# my_app.utils.com mail = CommunicationMail() sms = CommunicationSms() ... 时,是否可以调用CommunicationMail的新实例?问题是每次调用它都是相同的对象实例,所以即。当作为任务并行运行时,它们共享属性和重叠。

2 个答案:

答案 0 :(得分:1)

这是推荐的结构:

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

其中my_app.utils.com是:

Mail = CommunicationMail

如果确实希望保留com.mail.email_category1符号,Python当然会让你成为它的动态语言 (__getattr__ documentation):

# my_app.utils.com

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

mail = CommunicationMailFactory()

但是请使用第一种方法!“为什么,”你问。

首先,它清楚地说明了你在做什么:你正在实例化一个新实例并调用一个方法。对于__getattr__ hackery,这一点并不清楚。

其次,您可以将新近实例化的实例分配给变量mail1,然后调用mail1.email_category1(subject, template, ...)或其他任何内容。 __getattr__ hackery没有这种正常的,预期的灵活性。

答案 1 :(得分:0)

Python模块是单例,因此它只导入一次,因此mail = CommunicationMail()执行一次。

你可以:

from my_app.utils import com

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