不确定Python类代码有什么问题

时间:2013-01-24 16:56:49

标签: 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,人们没有像在这里那样向新手/ noob问题投票。

4 个答案:

答案 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