你有你的任务向后:
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 将查看该属性的类。这变成了在类实例之间共享数据的便捷方式。