试图在类中调用函数,但它不起作用

2024-10-01 17:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图调用一个函数,但它不起作用。代码如下:

class Compagnie:
    def __init__(self, nom, actions, prix):
        self.nom = nom
        self.actions = actions
        self.prix = prix


    def setActions(self):
        print("Changer le nombre d'actions pour " + self.actions)

我做到了:

Compagnie.setActions(50)

我得到一个错误: AttributeError: 'int' object has no attribute 'actions'

我做错了什么


Tags: 函数代码selfleactionsinitdefnom
3条回答

您的方法setActions未设置为接受任何参数。“self”是对实例的引用,允许您使用self修改实例变量。在这个方法里面。要解决此问题,请执行以下操作:

def setActions(self, val):
    self.actions = val
    print("Changer le nombre d'actions pour " + self.actions)

类可以包含三种类型的方法:

  1. 实例方法,例如

    def imethod(self,...): ...
    

    这些只能在类的实例上调用,并且可以访问类和实例属性。第一个参数传统上称为self,在实例上调用时自动传递给方法:

    instance = Class()
    instance.imethod(...)
    
  2. 类方法,例如

    @classmethod
    def cmethod(cls,...): ...
    

    这些可以在类本身或实例上调用,但只能访问类属性。第一个参数通常命名为cls,在类上调用时自动传递给方法:

    Class.cmethod(...)
    instance.cmethod(...)  # works, but can't access instance attributes.
    
  3. 静态方法,例如

    @staticmethod
    def smethod(...): ...
    

    这些函数与类相关,但无法访问实例或类属性,因此它们不会作为第一个参数传递给类或实例对象。可以在实例或类上调用它们:

    instance = Class()
    Class.smethod(...)
    instance.smethod(...)
    

示例(Python 3.9):

class Demo:

    cvar = 1

    def __init__(self,ivar):
        self.ivar = ivar
    
    @classmethod
    def cmethod(cls):
        print(f'{cls.cvar=}')

    @staticmethod
    def smethod():
        print('static')

    def imethod(self):
        print(f'{self.cvar=} {self.ivar=}')

Demo.smethod()
Demo.cmethod()
instance = Demo(2)
instance.smethod()
instance.cmethod()
instance.imethod()

输出:

static
cls.cvar=1
static
cls.cvar=1
self.cvar=1 self.ivar=2

在本例中,您定义了一个实例方法,但没有首先创建实例,因此您尝试传递的int参数被传递为self,并且在内部尝试访问整数50上的actions。首先创建一个实例,不要传递任何参数self将自动传递:

compagnie = Compagnie('nom','actions','prix')
compagnie.setActions()

类定义定义了Compagnie而不是Compagnies。除此之外,调用setActions需要一个对象,因此首先需要创建:

compagnie = Compagnie("foo", "bar", 33.0)

compagnie.setActions(50)

但是,这将失败,因为setActions的定义不带参数。从名称来看,我认为它的意思是:

    def setActions(self, actions):
        self.actions = actions
        print("Changer le nombre d'actions pour " + self.actions)

相关问题 更多 >

    热门问题