You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何需要将类实例化后赋值给变量调用方法?和函数有什么区别

报错原因说明

你代码里定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:00:05