不确定Python类代码哪里出错了
我还在努力理解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 就会去类里找这个属性。这就变成了一种方便的方式,可以在类的不同实例之间共享数据。