当我使用类中定义的函数时,它们不会被识别为已定义

Defined functions inside a class are not recognized as defined when I use them

提问人:JMarcos87 提问时间:3/15/2020 更新时间:3/15/2020 访问量:1242

问:

我有这段代码,但是当我尝试使用重新定义的 str 函数时,它不会打印任何内容,更重要的是,名为“cuadrant”的定义函数不起作用,因为它不是根据 python 定义的,但它是:

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
        print('The point ({},{}) has been created'.format(self.x, self.y))

    def __del__(self):
        print('The point ({},{}) has been deleted or overwritten'.format(self.x, self.y))

    def __str__(self):
        return '({},{})'.format(self.x, self.y)

    def cuadrant(self):
        if self.x > 0 and self.y > 0:
            return '1st Cuadrant'
        elif self.x < 0 and self.y > 0:
            return '2nd Cuadrant'
        elif self.x < 0 and self.y < 0:
            return '3rd Cuadrant'
        elif self.x >0 and self.y < 0:
            return '4th Cuadrant'
        else:
            return 'Original Point'

A = Point(4, 5)
B = Point(8, 9)

str(A)
str(B)

cuadrant(A)
cuadrant(B)

我得到的错误消息是这样的:

runfile('C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py', wdir='C:/Users/Jorge87/Desktop/Master 
Tema 1.5')
The point (4,5) has been created
The point (8,9) has been created
Traceback (most recent call last):

File "<ipython-input-9-16e5df591861>", line 1, in <module>
runfile('C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py', wdir='C:/Users/Jorge87/Desktop/Master 
Tema 1.5')

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 
827, in runfile
execfile(filename, namespace)

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 
110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py", line 38, in <module>
cuadrant(A)

NameError: name 'cuadrant' is not defined
Python 函数 对象 undefined-reference

评论

1赞 Boseong Choi 3/15/2020
print(str(A))将打印
1赞 Boseong Choi 3/15/2020
尝试Point.cuadrant(A)

答:

1赞 Lior Yehezkely 3/15/2020 #1

您似乎误解了方法的概念。在 python 中,使用点从对象调用方法,即 A.cuadrant() -- Good, cuadrant(A) -- Bad。

编辑#1:我应该提到,在某些语言中,例如 c++,可以使用类的命名空间调用方法,并将指向对象的指针作为第一个参数传递

编辑#2:受到评论和编辑#1的启发,Point.cuadrant(A)可能会起作用,也试试吧。尝试不同的方法执行方法,以充分了解它们的工作原理。

评论

0赞 JMarcos87 3/15/2020
谢谢,更正后我不再收到错误消息。但是,它仍然不会为重新定义的 str() 函数打印相同的结果
0赞 Lior Yehezkely 3/15/2020
do print(str(A))
1赞 Lior Yehezkely 3/15/2020
别忘了接受对你有帮助的答案;)
1赞 Boseong Choi 3/15/2020 #2

问题 1.重新定义的 str 函数,它不打印任何东西

在代码中使用:str

str(A)
str(B)

str返回预期的字符串,但您没有对它执行任何操作。
所以什么都没有打印。您应该执行以下操作:

print(str(A))
print(str(B))

问题 2.“cuadrant”不起作用

方法可以由类的命名空间引用。
所以如果你想引用方法,你应该编写代码。
cuadrantPoint.cuadrant

print(Point.cuadrant(A))

可能有效。
或者,更正常地说:

print(A.cuadrant())