为何需要将类实例化后赋值给变量调用方法?和函数有什么区别
报错原因说明
你代码里定义的roll是类的实例方法,Python规定所有实例方法的第一个形参默认接收调用该方法的类实例对象,行业惯例将该形参命名为self,这个参数由Python自动传入,不需要开发者手动传值。
两种调用方式的差异:
- 实例化后调用
dice.roll():Python会自动将前面的dice实例作为第一个参数传入roll方法匹配self形参,参数数量符合要求,运行正常。 - 直接调用
Dice.roll():没有对应的实例被自动传入self参数,相当于你调用一个需要1个参数的函数却没有传值,自然会触发位置参数缺失的报错。如果你一定要通过类名调用该实例方法,也可以手动传入实例对象,比如Dice.roll(Dice()),但这种写法不符合常规使用规范,没有必要这么写。
实例方法与普通函数的区别
- 普通函数是独立的代码块,不属于任何类或实例,定义时不需要预留
self参数,调用时按定义的参数列表传值即可,比如你定义普通函数:
def roll_dice(): import random return random.randint(1,6), random.randint(1,6)
直接调用roll_dice()就可以正常运行。
- 实例方法绑定在类的实例上,核心优势是可以通过
self访问、修改对应实例的专属属性,不同实例之间的属性互不干扰。比如你可以给Dice类加面数属性,实现自定义面数的骰子:
import random class Dice: def __init__(self, sides=6): self.sides = sides # 每个实例可以自定义骰子面数 def roll(self): a = random.randint(1, self.sides) b = random.randint(1, self.sides) return a,b dice6 = Dice() # 6面骰子 dice12 = Dice(12) # 12面骰子 print(dice6.roll()) # 输出1-6的随机数 print(dice12.roll()) # 输出1-12的随机数
如果你确实需要不需要实例就可以直接通过类名调用的方法,可以将方法定义为静态方法,添加@staticmethod装饰器,此时不需要写self参数:
import random class Dice: @staticmethod def roll(): a=random.randint(1,6) b = random.randint(1, 6) return a,b print(Dice.roll()) # 此时可以直接调用,不会报错
内容的提问来源于stack exchange,提问作者Bogdan Mind
相关产品推荐
相关产品推荐

