单光子

嘿,原谅我只是潜水,但是我有一个问题
想在另一个列表上询问,但这确实是一个普遍的问题
所以让我在这里问它.这是关于如何处理单身人士.
背景:我认真地在Python编程了大约一年
现在,可能会更长一些,具体取决于您的计算方式和系统我
我的制作足够复杂,我不得不进入一些
惯用我对python的了解,我不得不快速地做
通过测试代码研究和测试我的想法(当然可以错过
微妙的问题). OTOH,我现在有数十年的编程经验
并非完全没有立足点.我想我有一个我喜欢的解决方案
为了创建某种事情来充当单身人士,但我很好奇
别人的想法.
我的系统中有几个课程需要像
单例,它们是数据分类的库,其他
系统的配置库,需要全局.
我发现寻找单身人士的第一件事是在此的早期
项目,试图成为一个好公民,并从
Python社区本身,知道有人提到"辛格尔顿"和
在某个时候," Python"是一个建议这样做的建议:
(选项1)
类Tehlibrary(对象):
__ Single =无
def __init __(自我):
如果(tehlibrary .__单):
提高已经验证的感受#或其他
这很糟糕,因为这意味着要创建对象
当然,尝试块,我迅速隐藏在工厂中
功能,但仍然.
但是这种奏效的方式使我意识到班级本身是
完整的物体,很像我的C ++的实例(我爱我爱
您的C ++)视角,它是单一的.如果我可以存储该实例,我
可以在班级级别上共享成员的班级.班上
甚至不必完全成为单身人士.
(选项2)
因此,选项二是一系列选项,班级成员
可以用来分享需要共享的任何东西,尽管严格来说
班级不是单身人士,因为创建了多个实例
仅共享应该单身的数据(例如
班级管理的配置信息).
(选项3)
我仍然想要真正的单身人士,并意识到这一点,因为我必须
即使在选项1中创建工厂功能,我可以使用模块
控制这些工厂行为的水平变量
我意识到我基本上只是将模块本身用作
辛格尔顿.这是我到达的地方...
它运行代码的模块以建立其基本服务,就像一个
物体构造.它只能运行一次
进口.当客户端代码要求库时
Singleton,它得到了一个单身人士,该单元存储在模块级别
多变的.
有人发表评论吗?有什么错,邪恶或丑陋的
关于以这种方式使用模块,或者我正确地认为这是
这是一个通讯 在Python的接近.
是Pythonic吗?

# 回答1


在7月16日,5:20*下午,Craig Allen 在选项1中,您可以使用__new__方法,然后返回现有的
实例如果有一个,或者我相信,请在the上致电__init__
超类.或者,使用
@ClassMethod装饰器,与Classa.Create()实例化,然后返回
任何现有实例从那里.收获是您需要依靠
不使用默认实例语法的学科.
在选项2中,您必须用
@StaticMethod Decorator,所有实例方法都将在
相同的对象.
这些中的每一个都对继承有不同的后果,如果是
在您的项目中.
# 回答2


我不打算对此做太多子类别,但是当然,我
而不是第二个猜测未来,也不难以想象我们
我们将需要做到这一点.谢谢你
关于修复选项One的想法,我放弃了,尽管是理想的
仍然是
tl = tehlibrary()将始终返回相同的对象.
-craig
在7月16日,下午2:00,Castironpi 在选项1中,您可以使用__new__方法,然后返回现有的
实例如果有一个,或者我相信,请在the上致电__init__
超类.或者,使用
@ClassMethod装饰器,与Classa.Create()实例化,然后返回
任何现有实例从那里.收获是您需要依靠
不使用默认实例语法的学科.
在选项2中,您必须用
@StaticMethod Decorator,所有实例方法都将在
相同的对象.
这些中的每一个都对继承有不同的后果,如果是
在您的项目中.
# 回答3


在7月17日上午8:20,克雷格·艾伦(Craig Allen) 您可能无法再获得Pythonic,而不是
BDFL.在描述使用__new__ in in unifying类型和
Python的课程2.2 班级单例(对象):
def __new __(cls, *args,** kwds):
it = cls .__ dict __.获取(" __ it__")
如果不是没有:
把它返还
cls .__ it__ = it = object .__新__(cls)
it.init(*args,** kwds)
把它返还
def init(self, *args,** kwds):
经过
您可能会发现这是一个有用的起点.
# 回答4


在消息中
,Craig
艾伦写道:
.... @classmethod
.... def __new __(self,cls):
....返回自我
真的
# 回答5


在7月16日,6:20*下午,Craig Allen 一个缺点是它可能需要大量的全球群体
定义.而在常规课程中,您可以这样做:
def某物(自我):
self.var = 1
self.max = 10
使用模块作为单身人士,您会这样做:
def somings():
全局var
全球最大
var = 1
最大= 10
如果你 有很多模块重新定义的"属性",我会
建议采取措施避免全球范围.最直接的方式
是定义模块中的自我变量,该变量绑定到
模块本身,并通过它访问所有"属性".这
以下代码应该足够(尽管它可能在某个角落无法工作
案例):
self = sys.modules [__名称__]
因此,您可以重写类似的方法:
def somings():
self.var = 1
self.max = 10
[另一种可能性,这就是我要做的,就是使用功能
将模块作为第一个参数传递的装饰器.我有
这样做的原因,但没有做任何事情
做.它会像这样使用:
@modmethod
def某物(自我):
self.var = 1
self.max = 10
这是给予的
卡尔银行
# 回答6


在7月16日,晚上7:01,Lawrence D'Oliveiro central.gen.new_zealandwrote:
... @classmethod
... def __new __(self,cls):
...返回自我
真的
太好了,我只是在看时根本没有发现.谢谢!
# 回答7


在7月17日,00:20,Craig Allen 在这种情况下,我的方法是使用Borg模式
Singeltons.这确实是Pythonic,非常简单且有用.
查看http://aspn.activestate.com/aspn/coo...n/recipe/66531
德国Wikipedia使用metaclasse展示了另一种解决方案:http://de.wikipedia.org/wiki/singlet...s_borg-pattern
问候,uwe
# 回答8


在7月17日上午2:15,Uwe Schmitt
写道:
在这种情况下,我的方法是使用Borg模式
Singeltons.这确实是Pythonic,非常简单且有用.
看一下athttp://aspn.activestate.com/aspn/cookbook/python/recipe/66531
德国Wikipedia使用metaclasse展示了另一种解决方案:http://de.wikipedia.org/wiki/singlet...s_borg-pattern
问候,UWE
谢谢UWE,做一些搜索,我遇到了Borg模式
早晨.绝对相关.
再次感谢您的反馈,我对此感到非常放心
当需要这种事情时,选项.
# 回答9


在消息中
<98 *******************************************************@r66g2000hsg. GoogleGroups.com>,Craig
艾伦写道:... @classmethod ... def __new __(self,cls):...返回自我真实

太好了,我只是在看时根本没有发现.谢谢!
另请注意
s == tehlibrary
将是正确的(实例等于类).我认为这没关系
出于您的目的. :)

# 回答10


在7月16日,11:20*下午,Craig Allen 嗨,克雷格,
这可能是对设计模式的一般背景
Python:http://uk.youtube.com/watch?v=0vjjjlvbvtfg
- 帕迪.
# 回答11


在7月17日,晚上9:04,帕迪 嗨,克雷格,
这可能是对设计模式的一般背景
Python:http://uk.youtube.com/watch?v=0vjjjlvbvtfg
- 帕迪.
感谢您的链接稻田,我会看.
# 回答12


在文章<24 *****中 ***********************************************@e39g2000hsf. GoogleGroups.com>, craig allen

标签: python

添加新评论