Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法如何调用它所调用的类';谁是python中的成员?_Python_Class_Parsing_Interpreter - Fatal编程技术网

方法如何调用它所调用的类';谁是python中的成员?

方法如何调用它所调用的类';谁是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

我正在学习python,我偶然发现了下面部分的代码。Fraction类有一个
\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页开始。