不确定Python类代码哪里出错了

-2 投票
4 回答
2008 浏览
提问于 2025-04-17 13:33

我还在努力理解Python中的类,

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        angle1 = self.angle1
        angle2 = self.angle2
        angle3 = self.angle3
    number_of_sides = 3
    def check_angles(angle1, angle2, angle3):
        if angle1+angle2+angle3 == 180:
            return True
        else:
            return False

my_triangle = Triangle(30, 60, 90)
print(Triangle.number_of_sides)
print(Triangle.check_angles)

那么,问题出在哪里呢?

Stackoverflow上的一些用户真是太苛刻了,我来自MathStackExchange,那里的用户对新手或菜鸟的问题没有这么多负面评价。

4 个回答

1

我想你是想把构造函数写成这样:

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        self.angle1 = angle1
        self.angle2 = angle2
        self.angle3 = angle3
1

这里有一种写类和使用它的方法,不需要太多解释,你可以自己去学习:

class Triangle(object):
    def __init__(self, angle1, angle2, angle3):
        self.angle1 = angle1
        self.angle2 = angle2
        self.angle3 = angle3
    number_of_sides = 3
    def check_angles(self):
        return self.angle1+self.angle2+self.angle3 == 180

my_triangle = Triangle(30, 60, 90)
print(Triangle.number_of_sides)
print(my_triangle.check_angles())

输出结果:

3
True
5

你把作业搞反了:

self.angle1 = angle1

等等。

想一想发生了什么,可能会对你有帮助。self 是一个类 Triangle 的实例,也就是一个具体的对象。所以,

T = Triangle()
T.method_call()  #basically the same as `Triangle.method_call(T)`

method_call 里,self 就是指向 T 的。(__init__ 有点像魔法——它会在第一行自动调用,但原理还是一样的)。一旦你明白这一点,就很容易理解为什么需要 self.whatever = whatever——你是在给对象 T 添加一个新的属性!
最后,这也解释了你应该如何写 check_angles

def check_angles(self):
    #remember, `self` is a reference to a triangle instance -- T in our hypothetical code
    #so we can use `self` to gain access to all the attributes we set in `__init__`.
    if self.angle1 + self.angle2 + self.angle3 == 180:
        return True
    else:
        return False

现在稍微偏离一下,讲讲类属性。你也可以给一个添加属性:

class Triangle:
    number_of_sides = 3

我觉得通常是在定义方法(函数)之前先定义类属性,但其实你不一定要这样做。(不过这样做会帮助读你代码的人理解它——我最开始误解了你的代码就是因为你做事情的顺序)。

你也可以在类创建后动态地添加属性:

class Triangle:
    ...

Triangle.number_of_angles = Rhombus.number_of_angles - 1

你可以通过几种方式访问 Triangle.some_attribute。第一种方式是直接通过类来访问(Triangle.number_of_sides)。第二种方式是通过一个实例:

T = Triangle()
T.number_of_sides

这开始看起来有点奇怪。毕竟,实例并没有 number_of_sides 这个属性。其实,Python 设计时就是先查看实例是否有自己的 number_of_sides 属性。如果有,那就用这个。如果没有,Python 就会去类里找这个属性。这就变成了一种方便的方式,可以在类的不同实例之间共享数据。

撰写回答