Python 试图在类内调用函数,但它';它不工作了

Python 试图在类内调用函数,但它';它不工作了,python,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 "

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

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”对象没有属性“actions”


我做错了什么?

类定义定义了
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)

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

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

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

  • 实例方法,例如

    def imethod(self,...): ...
    
    @classmethod
    def cmethod(cls,...): ...
    
    @staticmethod
    def smethod(...): ...
    
    这些只能在类的实例上调用,并且可以访问类和实例属性。第一个参数传统上称为
    self
    ,在实例上调用时自动传递给方法:

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

    def imethod(self,...): ...
    
    @classmethod
    def cmethod(cls,...): ...
    
    @staticmethod
    def smethod(...): ...
    
    这些可以在类本身或实例上调用,但只能访问类属性。第一个参数传统上命名为
    cls
    ,在类上调用时自动传递给方法:

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

    def imethod(self,...): ...
    
    @classmethod
    def cmethod(cls,...): ...
    
    @staticmethod
    def smethod(...): ...
    
    这些函数与类相关,但无法访问实例或类属性,因此它们不会作为第一个参数传递给类或实例对象。可以在实例或类上调用它们:

    instance = Class()
    Class.smethod(...)
    instance.smethod(...)
    
  • 示例(Python 3.9):

    输出:

    static
    cls.cvar=1
    static
    cls.cvar=1
    self.cvar=1 self.ivar=2
    
    在您的例子中,您定义了一个实例方法,但没有首先创建实例,因此您尝试传递的
    int
    参数被传递为
    self
    ,并在内部尝试访问整数
    50
    上的
    操作。首先创建一个实例,不要传递任何参数<代码>自我
    将自动传递:

    compagnie = Compagnie('nom','actions','prix')
    compagnie.setActions()
    
    这是一个实例方法。这意味着它接受实例作为其第一个参数,该参数通常由
    self
    表示
    self
    允许方法访问实例的状态。因此,当您调用
    Compagnie.setActions(50)
    时,“50”将作为一个对象进行计算。这是Python对其进行评估的方式:

    def setActions(50):
        print("Changer le nombre d'actions pour " + 50.actions)
    
    因为50没有属性“actions”,所以会出现该错误。因为它是实例方法,所以可以通过实例调用它。或者,如果要按类调用它,则应创建一个实例并将其作为参数传递:

    c=Compagnie(1,"'my_actions'","my_prix") # create an instance
    Compagnie.setActions(c) # pass it as an arg
    

    除非您将方法定义为classmethod,否则您无法执行此操作。请先实例化Companie对象。Compagnies vs Compagnie?@D.Seah-Oh。我正在更新问题。您是否先实例化了一个实例?e、 g.compagnie=compagnie([“hello”],“world”),然后执行compagnie.setActions()。顺便说一句,setActions不接受任何参数。明白了。你说得对!非常感谢你!谢谢你的回答,我刚刚这么做了,但它给了我一个错误“TypeError:setActions()接受1个位置参数,但得到了2个”我不明白为什么会出现这个错误,因为除了self之外,没有为
    setActions()定义任何参数,而且它不使用任何其他参数。将其称为
    compagnie.setActions()
    将起作用。否则,您将不得不更改函数的定义,以添加一个参数来接受int。