D / B'self'和<classname>用于绑定类本身内部的函数。 (python中的单例)</classname>

时间:2012-07-27 00:23:55

标签: python variables singleton global-variables

这个问题可能看起来很傻(因为我是python的新手),但你能告诉我Binding时self和classname之间的区别是什么?

class OnlyOne(object):

  class __OnlyOne:
    def __init__(self):
       self.val = None

    def __str__(self):
       return ´self´ + self.val

 instance = None

 def __new__(cls): # __new__ always a classmethod
    if not OnlyOne.instance:
      OnlyOne.instance = OnlyOne.__OnlyOne()
            return OnlyOne.instance

 def __getattr__(self, name):
     return getattr(self.instance, name)

 def __setattr__(self, name):
      return setattr(self.instance, name)

在这里,我通常使用Instance作为self ...使用self和只有一个有什么区别...我的直觉告诉我,它是一个全局变量....如果它是一个全局变量,它根本没有意义(如果它是一个全局变量,我将编辑它)。谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我想我已经掌握了你的代码......它的工作方式是在调用构造函数时:

a = OnlyOne()  #call constructor.  This implicitly calls __new__

此时,__new__检查类以查看是否已创建实例(实例不是None)。如果尚未创建,则会创建一个实例并将其放入instance类属性中。然后返回instance class属性,然后将其作为self传递给您的方法。

我认为,如果你真的需要一个单身人士,那么你的程序设计就会有些可疑(懒惰)。单身人士允许信息以奇怪的方式在整个程序中传播(想象函数foobar两者都会创建OnlyOne的实例。您在foo中所做的更改会在您出现时显示致电bar) - 这有点类似于猴子补丁。

如果在重新思考你的设计几个月之后,你决定你确实需要一个单身,那么你可以创建一些更透明的工厂类......