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是光标。