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

2024-09-28 18:55:42 发布

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

我目前正在学习Python。由于我是OO(面向对象)编程的忠实拥趸,显然在Python中应用它并不难。但当我试过的时候,它看起来和C很不一样。在

正如你在下面看到的,我试图创建一个角色类,有三个属性Id,Hp和Mana。分数是由生命值和法力加起来,然后乘以10来计算的。在

如您所见,在定义了MyChar,其中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)

Tags: selfid角色属性def编程面向对象分数
3条回答

tl;dr

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


正如您所正确指出的,MyChar.Score是类“”(又称method)下的一个“函数。所以只要像其他函数一样使用它:用一对圆括号作为后缀。在

print(MyChar.Score())
#                 ^^

如果没有调用,只需执行print(MyChar.Score)将打印<bound method blah blah>,即方法的非正式字符串表示。print函数在内部调用^{}魔术方法(或者__repr__(),如果前者没有定义)。因此,以下打印等效行:

^{pr2}$

在Python中,函数是first-class citizens,因此它们是对象,具有__str__()和{}方法。在

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

有关Python's object model的更多信息,请查看官方文档。在

如果您想像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)

所以你不必像函数一样调用它。在

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

相关问题 更多 >