我正在学习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
答案 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__
方法已被识别并可以调用。