先说结论,再举实例验证。
结论:
在Python中,
函数加括号是指对此函数的调用,
函数不加括号是指调用函数本身(的内存地址),也可以理解成对函数重命名(希望这对你理解两者的区别有所帮助,如果你觉得没有帮助那就忽略此段逗号后面的内容)。
举个栗子。可能比较长,但耐心看的话你一定会有收获,不单单局限于题目问题本身。
我在自学《Python编程从入门到实践》第9章进行代码复写时,导入类这块一直无法得到自己想要的结果,如下所示:
from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name)
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
输出结果
<bound method Car.get_descriptive_name of <car.Car object at 0x000002EAB6F7EF60>>
This car has 23 miles on it.
第一行<bound method …>是什么意思?后来才知道后面那一串其实就是函数的内存地址,但当时网上没找到类似问题的回答,只是在搜索答案的过程模糊意识到可能跟我编写的类,也就是import的对象Car的方法有关。于是开始翻看Car的源代码,发现get_descriptive_name这个函数的代码如下所示:
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
你会发现,这个函数只有代表它自身的形参,也就是说在调用该函数的时候是无法传参的。可是,这个发现对解决题目问题似乎没有帮助。
不过,也正是借助这个发现,我认识到是自己在调用此函数时没有在后面加括号。因为我是要调用此函数的方法,结果没有加括号让Python以为我要调用函数本身。经过更正后,如下所示:
from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
输出结果:
2016 Audi A4
This car has 23 miles on it.
Profect !