方法如何调用它所调用的类';谁是python中的成员?
我正在学习python,我偶然发现了下面部分的代码。Fraction类有一个方法如何调用它所调用的类';谁是python中的成员?,python,class,parsing,interpreter,Python,Class,Parsing,Interpreter,我正在学习python,我偶然发现了下面部分的代码。Fraction类有一个\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法,其返回调用Fraction类。 (返回分数(new\u num//common,new\u den//common)) 我真的不明白一个方法如何调用它所属的类。我的意思是,当\uuu add\uuu方法调用分数类时,解释器甚至还没有完全阅读完分数类(在\uuuu add\uu方法之后仍然有\uuueq\uu方法)。如果\uuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,其返回调用Fraction类。
(返回分数(new\u num//common,new\u den//common)
)
我真的不明白一个方法如何调用它所属的类。我的意思是,当
\uuu add\uuu
方法调用分数类时,解释器甚至还没有完全阅读完分数类(在\uuuu add\uu
方法之后仍然有\uuueq\uu
方法)。如果\uuuuuuuuuuuuuuuuuuuu添加
方法想要在\uuuuuuuueq\uuuuuuuuuu
方法低于它时使用类\uuuuueq\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuq>方法,该怎么
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
你所谓的“调用分数类”实际上是用给定的分子和分母创建一个新的分数实例。如果您熟悉Java,这相当于返回新分数(…)
。在Python中,我们不使用关键字new
我的意思是口译员甚至还没有完全读完分数课
当解析这一行时,解释器知道分数
类存在,这在当时就足够了。通过调用\uuuu add\uuuu()
函数对Fraction
实例执行该行时,解释器可以使用整个Fraction
类
如果\uuuuuuuuuuuuuuuuuuuu添加
方法想要在\uuuuuuuueq\uuuuuuuuuu
方法低于它时使用类\uuuuueq\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuq>方法,该怎么
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
这是非常好的,因为在执行方法主体时,\uuuuu eq\uuu
方法已被识别并可供调用
我的意思是口译员甚至还没有完全读完分数课
当您第一次执行\uuuuu add\uuuu
时,它已经被解析并执行。函数体和方法体不会在导入时执行,但类体(甚至嵌套类体)会执行
演示脚本:
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
“我的意思是解释器甚至还没有完全读完分数类”请修复你的代码缩进!等到你了解递归…@user3124200问题解决了吗?实际上,解释器不知道有分数类,但也不需要。在\uuuu add\uuuu
的主体中,分数
只是另一个自由变量(因为它不是参数或局部变量),一旦调用函数,其查找将根据常规规则进行。在这一点上,Fraction
将(或者至少,很可能;它不必!)解析为在这一点上定义的类。。。。。。如果Fraction
的主体包含试图调用\uuuu add\uuuu
的代码(作为一个函数,因为它实际上还不是一个方法),那么它很可能会失败,并出现NameError
,因为Fraction
尚未绑定(至少,没有被定义的类)。@chepner感谢您的澄清。我的思维模式可能不是100%正确。我想从全局上下文或其他函数调用\uuuu add\uuu
,而不是从Fraction
的主体调用。这是您在学习该语言时需要了解的内容,还是参加编译器课程来理解类似内容会有所帮助?@user3124200,当您通过询问其他Python程序员学习该语言时,您就明白了这一点,不是吗?:)就我个人而言,我从《流畅的Python》一书中了解到了这一点。它的评估时间练习从第666页开始。