如何更优雅的实现工厂模式或其他解决方法

119 views
Skip to first unread message

Cevin

unread,
Aug 26, 2018, 10:47:18 AM8/26/18
to python-cn(华蟒用户组,CPyUG 邮件列表)

场景是这样的
commands目录中会有一堆的py文件。每个文件都是一个class。每个class都有不同的方法。


比如:
#user.py

class user():
   
def login():
       
pass

# order.py

class order():
   
def close(order_id):
       
pass

像这种文件在commands目录中有很多,而且随时会增加或者减少。有一个daemon.py会根据MQ消息队列的命令动态的实例化某个命令并且传递对应的参数过去。

# daemon.py 伪代码
import commands

while True:
    message
= json.loads(mq.receive())
   
if not hasattr(commands, message['class'])
        logger
.warn("error")
    command
= commands[message['class']]()
    command
. message['action'] (message) ????

应该如何实现或者我不应该这么用python?用php用惯了吗?


Zoom.Quiet

unread,
Aug 26, 2018, 11:16:03 AM8/26/18
to CPyUG~华蠎用户组
搜索一下过往 PyCon 中,有关 import 的分析,
你就有思路了.
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
> 要查看更多选项,请访问https://groups.google.com/d/optout



--
life is pathetic, go Pythonic! 人生苦短, Python当歌!
俺: http://zoomquiet.io
授: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过!备份不做,十恶不赦!
KM keep growing environment culture which promoting organization learning!

Cevin

unread,
Aug 26, 2018, 2:27:44 PM8/26/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
其实问题核心应该是怎么优雅的动态实例化一个对象和call一个动态名称的方法。我已经from commands import * 了。

在 2018年8月26日星期日 UTC+8下午11:16:03,Zoom Quiet写道:
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

yegle

unread,
Aug 26, 2018, 4:38:56 PM8/26/18
to pyth...@googlegroups.com
不需要动态载入新增的.py文件?如果是我的话就直接globals()里取用了…

Cevin <cevin....@gmail.com> 于 2018年8月26日周日 上午11:27写道:
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
> 要查看更多选项,请访问https://groups.google.com/d/optout



--
life is pathetic, go Pythonic! 人生苦短, Python当歌!
俺: http://zoomquiet.io
授: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过!备份不做,十恶不赦!
KM keep growing environment culture which promoting organization learning!

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

Shell Xu

unread,
Aug 26, 2018, 10:17:27 PM8/26/18
to CUPG
你把你这个请求编译为python代码,再exec一下不就好了?里面你想import谁就import谁,想怎么调就怎么调用。

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/

Cevin

unread,
Aug 27, 2018, 1:52:14 AM8/27/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
动态import并不是什么问题,已经都解决了。关键是这样,从消息队列里获取的是一个字符串:`class.method` 这样的格式。拆分成两个字符串是class和Method,怎么动态实例化class并调用method,都是动态的……然后就没有头绪了。

在 2018年8月27日星期一 UTC+8上午4:38:56,@yegle写道:
不需要动态载入新增的.py文件?如果是我的话就直接globals()里取用了…

> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
> 要查看更多选项,请访问https://groups.google.com/d/optout



--
life is pathetic, go Pythonic! 人生苦短, Python当歌!
俺: http://zoomquiet.io
授: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过!备份不做,十恶不赦!
KM keep growing environment culture which promoting organization learning!

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

rong zhao

unread,
Aug 27, 2018, 2:15:08 AM8/27/18
to pyth...@googlegroups.com
不知道我理解的对不对,你的消息队列里的消息是应该调用某个类的某个方法,所以你想解析字符串,然后动态创建那个类的对象,调用那个方法。

给个sample:
我的目录结构:

.
├── commands
│ └── User.py
└── main.py

----User.py 内容----

class User:
def user_f(self):
print("user method")


----main.py 代码----

import importlib

# simluate your message, call user_f fuction in User class
msg = "User.user_f"

cls, method = msg.split(".")
model = importlib.import_module("commands.%s" % cls)
api_cls = getattr(model, cls)
api_ins = api_cls()
api_method = getattr(api_ins, method)

result = api_method()


输出结果:
user method
Cevin <cevin....@gmail.com> 于2018年8月27日周一 下午1:52写道:
>>>> > 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>>> > 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
>>>> > 要查看更多选项,请访问https://groups.google.com/d/optout
>>>>
>>>>
>>>>
>>>> --
>>>> life is pathetic, go Pythonic! 人生苦短, Python当歌!
>>>> 俺: http://zoomquiet.io
>>>> 授: http://creativecommons.org/licenses/by-sa/2.5/cn/
>>>> 怒: 冗余不做,日子甭过!备份不做,十恶不赦!
>>>> KM keep growing environment culture which promoting organization learning!
>>>
>>> --
>>> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> ---
>>> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

rong zhao

unread,
Aug 27, 2018, 2:58:07 AM8/27/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
哦。。我理解了,你的问题不是动态,是设计模式。。。抱歉,这还取决于你的那些commands类中的对象能不能复用吧(线程安全),如果线程安全的,单例模式,防止频繁的创建和销毁。

工厂模式是调用统一的创建对象接口,获取不同的子类对象,感觉和这个应用场景不太适应。。

如果线程不安全:原型模式?把module信息缓存,避免每次都导入一次?其实性能没什么影响,随便写写把,感觉不会有多大影响。。。

我感觉我会被一群人批评了。。



在 2018年8月27日星期一 UTC+8下午2:15:08,rong zhao写道:
>>>> > 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>>> > 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
>>>> > 要查看更多选项,请访问https://groups.google.com/d/optout
>>>>
>>>>
>>>>
>>>> --
>>>> life is pathetic, go Pythonic! 人生苦短, Python当歌!
>>>> 俺: http://zoomquiet.io
>>>> 授: http://creativecommons.org/licenses/by-sa/2.5/cn/
>>>> 怒: 冗余不做,日子甭过!备份不做,十恶不赦!
>>>> KM keep growing environment culture which promoting organization learning!
>>>
>>> --
>>> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> ---
>>> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

whycrying

unread,
Aug 27, 2018, 6:22:10 AM8/27/18
to pyth...@googlegroups.com
Python 这边的惯例似乎是像 Shell Xu 所说的那样,比如洪强宁 2010 年的分享:

Python于Web 2.0网站的应用 - QCon Beijing 2010
79/151

附图:
www.slideshare.net-hongqn-qcon2010-3881323-p79.png

不需要动态载入新增的.py文件?如果是我的话就直接globals()里取用了…

> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
> 要查看更多选项,请访问https://groups.google.com/d/optout



--
life is pathetic, go Pythonic! 人生苦短, Python当歌!
俺: http://zoomquiet.io
授: http://creativecommons.org/licenses/by-sa/2.5/cn/
怒: 冗余不做,日子甭过!备份不做,十恶不赦!
KM keep growing environment culture which promoting organization learning!

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--

laike9m

unread,
Aug 27, 2018, 7:49:38 AM8/27/18
to pyth...@googlegroups.com
动态 import 用 importlib 或者 __import__ 就行了...或者是我没理解对问题么
> 您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
> 要查看更多选项,请访问 https://groups.google.com/d/optout
>


--

--
laike9m.com

laike9m

unread,
Aug 27, 2018, 7:50:28 AM8/27/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
动态 import 用 importlib 或者 __import__ 就行了...或者是我没理解对问题么

shhgs

unread,
Aug 27, 2018, 8:09:11 AM8/27/18
to pyth...@googlegroups.com
我没看懂哎。问题不是已经解决了吗?能动态import 一个class难道还不能实例化它的对象?拿到了对象以及要调用的方法的名字难道不知道怎么去调用方法?楼主的需求到底是什么能讲清楚吗?

Cevin

unread,
Aug 28, 2018, 3:58:54 AM8/28/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
对的。就是想这样的。因为接口太多不可能多个人去维护一个巨无霸的list。。


在 2018年8月27日星期一 UTC+8下午2:15:08,rong zhao写道:
不知道我理解的对不对,你的消息队列里的消息是应该调用某个类的某个方法,所以你想解析字符串,然后动态创建那个类的对象,调用那个方法。
>>>> > 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>>> > 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
>>>> > 要查看更多选项,请访问https://groups.google.com/d/optout
>>>>
>>>>
>>>>
>>>> --
>>>> life is pathetic, go Pythonic! 人生苦短, Python当歌!
>>>> 俺: http://zoomquiet.io
>>>> 授: http://creativecommons.org/licenses/by-sa/2.5/cn/
>>>> 怒: 冗余不做,日子甭过!备份不做,十恶不赦!
>>>> KM keep growing environment culture which promoting organization learning!
>>>
>>> --
>>> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> ---
>>> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
Reply all
Reply to author
Forward
0 new messages