方法如何在python中调用它所属的类?

时间:2018-10-16 19:57:23

标签: python class parsing interpreter

我正在学习python,并在下面找到了Fraction的代码。 Fraction类有一个__add__方法,其返回值调用Fraction类。 (return Fraction(new_num // common, new_den // common)

我真的不知道方法如何调用它所属的类。我的意思是,当__eq__方法调用Fraction类时,解释器甚至还没有完全读完Fraction类(在__add__方法之后还有__add__方法)。如果__add__方法在其下方时,__eq__方法想使用类__eq__方法怎么办?

class Fraction:
    def __init__(self, top, bottom):
        self.num = top
        self.den = bottom
    def __str__(self):
        return str(self.num) + "/" + str(self.den)
    def show(self):
        print(self.num, "/", self.den)
    def __add__(self, other_fraction):
        new_num = self.num * other_fraction.den + \
            self.den * other_fraction.num
        new_den = self.den * other_fraction.den
        common = gcd(new_num, new_den)
        return Fraction(new_num // common, new_den // common)
    def __eq__(self, other):
        first_num = self.num * other.den
        second_num = other.num * self.den
        return first_num == second_num

2 个答案:

答案 0 :(得分:2)

  

我的意思是翻译员甚至还没有完全读完Fraction类

当您第一次执行__add__时,它已经被解析并执行。函数和方法主体不会在导入时执行,但是类主体(甚至是嵌套的类主体)也会执行。

演示脚本:

class Upper:
    print('Upper')
    class Mid:
        print('Mid')
    def method(self):
        class Low:
            print('Low')
        print('method')

输出:

$ python3
>>> import demo
Upper
Mid

因此,在该方法中引用方法的类并不是错误(因为在类构造过程中未调用该方法)。

另一方面,当类的名称仍在导入期间执行的部分中构建时,您将无法访问它的名称。

>>> class A:
...     print(A)
...
[...]
NameError: name 'A' is not defined

答案 1 :(得分:0)

return Fraction(new_num // common, new_den // common)

您所谓的“调用分数类”实际上是使用给定的分子和分母创建Fraction的新实例。如果您熟悉Java,则等效于return new Fraction(...)。在Python中,我们不使用关键字new

  

我的意思是翻译员甚至还没有完全读完Fraction类

当这一行被解析时,解释器知道存在Fraction类,这在那时就足够了。到在__add__()的实例上调用Fraction函数执行该行时,解释器就可以使用整个Fraction类。

  

如果__add__方法在其下方时,__eq__方法想使用类__eq__怎么办?

这很好,因为在执行该方法的主体时,__eq__方法已被识别并可以调用。