Python调用方法/函数时“.”的用法困惑求解
关于Python中
.的两种常见用法解惑 嘿,刚学Python没几天就能注意到这个细节,真的超棒!其实你困惑的点,核心是搞清楚**.在不同场景下的作用本质**——它本质上都是用来访问某个对象的成员/属性,但对象的类型不同,调用逻辑就不一样。
先给你拆解一下np.random.rand()的逻辑:
np是我们导入numpy模块时取的别名,它本身是一个模块对象;random是numpy模块里的一个子模块(你可以理解成模块里的“子文件夹”,专门放随机数相关的功能);rand()是这个random子模块里定义的普通函数,它不需要绑定任何类实例,直接调用就能生成随机数。
这里的每一个.,只是用来“深入”访问上一级对象的成员:从主模块np,进到子模块random,再调用里面的函数rand()——和你理解的类实例方法的.,作用完全不同。
再对比你已经懂的类方法场景:
类内部定义的def是实例方法,它的第一个参数self是用来绑定调用它的实例的,所以必须用实例名.方法名()的方式调用,这时候.的作用是把实例和方法绑定起来,让self能指向这个实例。
举个更直观的例子,你可以自己模拟这个结构:
假设你写了一个简单的模块文件my_tools.py:
# my_tools.py # 模块里的普通函数 def say_hi(): print("Hi from module!") # 模块里的子模块(简化版,实际可以是单独的子模块文件) class RandomUtils: @staticmethod def generate_num(): return 42 # 随便返回一个数 # 把RandomUtils实例化后作为模块的成员,模拟np.random的结构 random = RandomUtils()
然后在另一个文件里导入调用:
import my_tools as mt # 调用模块里的普通函数 mt.say_hi() # 调用模块子对象里的静态函数,就像np.random.rand() mt.random.generate_num()
这里的mt.random.generate_num()和np.random.rand()逻辑完全一致:都是通过.访问模块里的成员,再调用成员里的函数,不需要绑定实例(因为这里用了静态方法,和普通模块函数一样不需要self)。
最后再帮你梳理一下.的核心用法:
- 当
.左边是类的实例时:调用的是实例方法,self会自动绑定这个实例,这是你已经理解的场景; - 当
.左边是模块/子模块时:只是访问模块里的函数、类、子模块等成员,这些成员不需要绑定实例,直接调用即可; - 还有一种情况:
.左边是类对象时,调用的是类方法或静态方法,也不需要实例,但这是另一个进阶知识点了,你以后会慢慢接触到。
内容的提问来源于stack exchange,提问作者Leo Ryuta Unoki
相关产品推荐
相关产品推荐

