我仍然在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,人们没有像在这里那样向新手/ noob问题投票。
答案 0 :(得分: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旨在查看实例 first 以查看它是否具有自己的number_of_sides
属性。如果它确实如此,那就是你得到的。但是,如果没有,那么python将查看该属性的类。这变成了在类实例之间共享数据的便捷方式。
答案 1 :(得分:1)
我认为你打算像这样编写构造函数:
class Triangle(object):
def __init__(self, angle1, angle2, angle3):
self.angle1 = angle1
self.angle2 = angle2
self.angle3 = angle3
答案 2 :(得分:1)
我猜这是Python Koans练习。很棒的图书馆和好运!
我相信你有两个问题。
首先是作业。自我在左侧。
第二个是你的方法创建。你需要传递自变量并引用属性
class Triangle(object):
def __init__(self, angle1, angle2, angle3):
self.angle1 = angle1
self.angle2 = angle2
self.angle3 = angle3
self.number_of_sides = 3
def check_angles(self):
if self.angle1 + self.angle2 + self.angle3 == 180:
return True
else:
return False
答案 3 :(得分: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