如何在类下正确使用函数?

Fra*_*nkW 8 python python-3.x

我目前正在学习Python。由于我是OO(面向对象)编程的忠实拥护者,因此显然在Python中应用它并不难。但是,当我尝试它时,它似乎与C#完全不同。

如下所示,我正在尝试创建一个具有三个属性Id,Hp和Mana的角色类。得分是通过将Hp和Mana相加然后乘以10得出的。

如您所见,在定义MyChar where之后id=10 hp=100 mana=100,我期望的MyChar.Score是(100 + 100)* 10,即2000,但是很奇怪,它说:

bound method Character.Score of <__main__.Character object at 0x0000021B17DD1F60>作为的结果print(MyChar.Score)

我该如何解决这个问题?

这是我的代码:

class Character:

    def __init__(self, Id, Hp, Mana):
        self.Id = Id;
        self.Hp = Hp;
        self.Mana = Mana;


    def Score(self):
        return (self.Hp + self.Mana)*10;

MyChar = Character(10, 100, 100);

print(MyChar.Score)
Run Code Online (Sandbox Code Playgroud)

Ada*_*Er8 25

如果要像C#中的属性一样使用它,请使用来装饰函数@property,如下所示:

class Character:

    def __init__(self,Id,Hp,Mana):
        self.Id=Id;
        self.Hp=Hp;
        self.Mana=Mana;

    @property
    def Score(self):
        return (self.Hp+self.Mana)*10;

MyChar=Character(10,100,100);

print(MyChar.Score)
Run Code Online (Sandbox Code Playgroud)

因此,您不必像函数一样调用它。

有关属性的更高级用法(例如,还具有setter函数),请参见官方文档:https : //docs.python.org/3/library/functions.html#property

  • 虽然这是一个不错的建议,但它并不能真正回答OP的问题。 (6认同)
  • 虽然标题确实询问了如何使用该功能,但正文只是问“我该如何解决这个问题?” 看来“MyChar.Score()”或“@property def Score”都会导致打印语句按照OP的要求工作,并且这种方法的优点是将更多逻辑封装到类定义中。 (2认同)

Tre*_*edJ 19

tl; dr

像调用任何其他函数一样使用它:(print(MyChar.Score())请注意另外一对括号)。


正如您已经正确指出的那样,MyChar.Score它是“类下的函数”(又称方法)。因此,只需像调用其他函数一样使用它:在其后加上一对括号即可。

print(MyChar.Score())
#                 ^^
Run Code Online (Sandbox Code Playgroud)

在没有调用的情况下,只需执行print(MyChar.Score)print即可<bound method blah blah>,即该方法的非正式字符串表示形式。该print函数在内部调用__str__()magic方法(__repr__()如果未定义前者,则调用)。因此,以下打印等效行:

print(MyChar.Score.__str__())
print(str(MyChar.Score))
print(MyChar.Score.__repr__())
print(repr(MyChar.Score))
Run Code Online (Sandbox Code Playgroud)

在Python中,函数是一等公民,因此它们是对象,并具有__str__()__repr__()方法。

  • 没有括号,您没有调用该函数。相反,您是在打印函数本身的表示形式,这是称为“ Score”的字符类的一种方法。 (7认同)

bru*_*ers 7

在Python中,一切都是对象,包括类,函数和方法,因此MyChar.Score(不带括号)只能解析对象的Score属性MyChar。这将产生一个method对象,该对象恰好是可调用对象(实现__call__特殊方法的对象)。然后,您必须应用调用运算符(paren)来实际调用它。

您可能需要查看官方文档,以获取有关Python对象模型的更多信息