Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误,带有属性方法的单例模式_Python_Python 2.7_Python 3.x - Fatal编程技术网

Python 属性错误,带有属性方法的单例模式

Python 属性错误,带有属性方法的单例模式,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,在处理数据库连接时,出于明显的原因,我使用了单例模式。为了简化,我简化了类定义,问题仍然是一样的 班级: class Point(object): _instance = None def __new__(cls, x, y): if Point._instance is None: Point._instance = object.__new__(cls) Point._instance.x = x

在处理数据库连接时,出于明显的原因,我使用了单例模式。为了简化,我简化了类定义,问题仍然是一样的

班级:

class Point(object):
    _instance = None

    def __new__(cls, x, y):
        if Point._instance is None:
            Point._instance = object.__new__(cls)
            Point._instance.x = x
            Point._instance.y = y
        return Point._instance

    def __init__(self, x, y):
        self.x = x
        self.y = y

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, x):
        self._x = self._instance.x

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, y):
        self._y = self._instance.y

    def __str__(self):
        return 'x: {}, y: {} id.x: {}'.format(self.x, self.y, id(self.x))
它会生成以下错误:

AttributeError: 'Point' object has no attribute '_x'
我发现了以下解决方法:

class Point(object):
    _instance = None

    def __new__(cls, x, y):
        if Point._instance is None:
            Point._instance = object.__new__(cls)
            Point._instance.x = x
            Point._instance.y = y
        return Point._instance

    def __init__(self, x, y):
        self.x = self._instance.x
        self.y = self._instance.y

python的方法是使用property方法,因此我仍然有这种渴望,即使我有一个工作代码,有人能解释我为什么会有这样的错误。

\uuu init\uuuu
中调用
self.x
时,控件(通过描述符)会移动到
x的setter,这会:

self._x = self._instance.x
这反过来会调用试图执行以下操作的getter:

return self._x 
self.\u x
设置之前。
\u y
也存在类似情况

我的印象是,你不希望人们改变
x
y
的值,如果是这样,就让他们改变


作为补充,没有理由在
\uuuuuu new\uuuuuu
中设置值
x
y
,当在
\uuuuuu init\uuuuu

中调用
self.x
时,控件(通过描述符)会移动到
x
的设置器,这会:

self._x = self._instance.x
这反过来会调用试图执行以下操作的getter:

return self._x 
self.\u x
设置之前。
\u y
也存在类似情况

我的印象是,你不希望人们改变
x
y
的值,如果是这样,就让他们改变


作为补充,没有理由在
\uuuuuu new\uuuuuu
中设置值
x
y
,您可以在
\uuuuu init\uuuuuu

中设置它们,尽管我不确定您为什么要这样做,但您可以尝试:

\u实例=无
def点(x,y):
类_点(对象):
定义初始化(self,x,y):
self.x=x
self.y=y
定义(自我):
返回'x:{},y:{}id.x:{}'。格式(self.x,self.y,id(self.x))
全局实例
如果_实例为无:
_实例=_点(x,y)
返回_实例
p1=点(1,2)
打印“p1”,p1
p2=点(3,4)
p2.x=10
打印“p2”,p2
打印“p1”,p1
输出

p1x:1,y:2 id.x:94912852734312
p2 x:10,y:2 id.x:94912852734096
p1 x:10,y:2 id.x:94912852734096

虽然我不知道您为什么要这样做,但您可以尝试:

\u实例=无
def点(x,y):
类_点(对象):
定义初始化(self,x,y):
self.x=x
self.y=y
定义(自我):
返回'x:{},y:{}id.x:{}'。格式(self.x,self.y,id(self.x))
全局实例
如果_实例为无:
_实例=_点(x,y)
返回_实例
p1=点(1,2)
打印“p1”,p1
p2=点(3,4)
p2.x=10
打印“p2”,p2
打印“p1”,p1
输出

p1x:1,y:2 id.x:94912852734312
p2 x:10,y:2 id.x:94912852734096
p1 x:10,y:2 id.x:94912852734096

缩进。这很痛。你为什么想要一个积分班成为单身汉@jq170727我没有注意缩进抱歉,我刚刚从编辑器中删除了代码。@wim Point类与该点无关,我没有发布所有处理数据库连接的代码并丢失该点,而是在一些简单的问题上重复了相同的错误。缩进。这很痛。你为什么想要一个积分班成为单身汉@jq170727我没有注意缩进抱歉,我刚刚从编辑器中删除了代码。@wim Point类与此无关,我没有发布所有处理与数据库连接的代码并丢失该点,而是在一些简单的问题上重复了相同的错误。如我的问题中所述,原来的类是处理数据库连接的,所以我防止了多次实例化,请大家耐心点,想象x是连接,y是光标,正如我在问题中提到的,原来的类是处理数据库连接的,所以我防止了多次实例化,请耐心听我说,想象x是连接,y是光标。