Python:AttributeError:';点';对象没有属性';x';

Python:AttributeError:';点';对象没有属性';x';,python,attributeerror,Python,Attributeerror,在Distance()的返回行中,_x而不是x(y和z相同),因为Point类的实例没有x、y和z属性,但它们有_x、_y、_z属性。 ​ 实际错误是由于访问了toPoint.x,该文件不存在,因为您从未定义过它。 另一方面,在属性前面加上双下划线会激活pythons功能。实际属性仍将在类外的mypoint.\ux,mypoint.\uy等处公开访问 就风格而言,在本例中似乎没有任何理由使用名称损坏。该特性的预期用途是避免与继承类发生冲突,而不是试图创建“私有”变量(为此,约定是使用一个下划线来

在Distance()的返回行中,_x而不是x(y和z相同),因为Point类的实例没有x、y和z属性,但它们有_x、_y、_z属性。 ​


实际错误是由于访问了
toPoint.x
,该文件不存在,因为您从未定义过它。

另一方面,在属性前面加上双下划线会激活pythons功能。实际属性仍将在类外的
mypoint.\ux
mypoint.\uy
等处公开访问

就风格而言,在本例中似乎没有任何理由使用名称损坏。该特性的预期用途是避免与继承类发生冲突,而不是试图创建“私有”变量(为此,约定是使用一个下划线来指示何时使用属性)


在您的情况下,我认为您应该只命名(并访问)属性,通常是
x
y
,等等。在python中,我们通常不为类成员编写getter和setter,除非有特殊要求,因为

您可以公开访问Point类的
x
y
z
属性。如果您希望客户机能够读而不是写,可以使用。例如:

def Distance(self, toPoint):
    toPoint.PointCoords[0]
    toPoint.PointCoords[1]
    toPoint.PointCoords[2]
    return math.sqrt(
        (self.__x - toPoint.__x)**2 +
        (self.__y - toPoint.__y)**2 +
        (self.__z - toPoint.__z)**2)
然后,您可以访问x、y和z,而无需使用前导下划线,并且距离函数应该可以工作

class Point(object):
    def __init__(self, x = 0, y = 0, z = 0, description = 'TBD'):
        self.__x = x
        self.__y = y
        self.__z = z
        self.__description = description

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

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

    @property
    def z(self):
        return self.__z

    ...
p=点(1,2,3,‘虚拟’) >>>p.x 1. >>>警察 2. >>>p.z 3. >>>p.x=3 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:无法设置属性
此示例使用集合中的namedtuple类。我还重新编写了类来实现它(它仍然可以与现有程序一起工作)

还要注意,python通常不使用setter或getter。事实上您可以直接在程序中设置描述(您应该这样做),而不是使用setter函数

>>> p = Point(1, 2, 3, 'Dummy')
>>> p.x
1
>>> p.y
2
>>> p.z
3
>>> p.x = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

另一种方法是将
toPoint.PointCoords
解包成如下局部变量:

import math
from collections import namedtuple

point = namedtuple('point', ['x', 'y', 'z'])

class Point(object):
    def __init__(self, x=0, y=0, z=0, description='TBD'):
        self.point = point(x, y, z)
        self.__description = description

    def __repr__(self):
        return str(self.point)

    def set_point(self, coords):
        self.point = point(coords)

    def get_point(self):
        p = self.point
        return p.x, p.y, p.z

    def distance(self, toPoint):
        p = toPoint.point
        return math.sqrt(
            (self.point.x - p.x)**2 +
            (self.point.y - p.y)**2 +
            (self.point.z - p.z)**2)

    def set_description(self, description):
        # Python generally does not use getters/setters.
        self.description = description

    def get_description(self):
        # Python generally does not use getters/setters.
        return self.description

@wim实际上,我刚刚尝试过,它似乎很有效(除了OP混合了int和str的另一个bug),我最终能够以这种方式工作,只需要制作self。uuuu x=int(x),self。uu y=int(y),self。uuu z=int(z)在init中,然后将else语句的第二个到最后一个打印出来就可以了。@wim:这确实有效。对于同一个类的实例,您仍然可以访问该类中以前导双下划线命名的属性。这确实有效,我错了(今天学到了一些东西!)。我做了一个虚拟编辑,所以我可以删除downvoteunrelated,但这个程序中的另一个错误来自这样一个事实,即pointX、pointY和pointZ将是str而不是数字。。。因此,您将无法在第22.3行执行减法。更多错误:第59行,print语句的缩进错误(应该与if语句具有相同的缩进),第59行PointDescription和PointCoords不可调用=>无括号我同意不需要更改名称,这样的属性仍然可以访问,而不会在同一类的实例中造成名称混乱。
>>> p = Point(1, 2, 3, 'Dummy')
>>> p.x
1
>>> p.y
2
>>> p.z
3
>>> p.x = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
import math
from collections import namedtuple

point = namedtuple('point', ['x', 'y', 'z'])

class Point(object):
    def __init__(self, x=0, y=0, z=0, description='TBD'):
        self.point = point(x, y, z)
        self.__description = description

    def __repr__(self):
        return str(self.point)

    def set_point(self, coords):
        self.point = point(coords)

    def get_point(self):
        p = self.point
        return p.x, p.y, p.z

    def distance(self, toPoint):
        p = toPoint.point
        return math.sqrt(
            (self.point.x - p.x)**2 +
            (self.point.y - p.y)**2 +
            (self.point.z - p.z)**2)

    def set_description(self, description):
        # Python generally does not use getters/setters.
        self.description = description

    def get_description(self):
        # Python generally does not use getters/setters.
        return self.description
def Distance(self, toPoint):
    x, y, z = toPoint.PointCoords
    return math.sqrt(
        (self.__x - x)**2 +
        (self.__y - y)**2 +
        (self.__z - z)**2)