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

时间:2019-06-11 11:19:35

标签: python python-3.x

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

正如您在下面看到的,我正在尝试创建一个具有三个属性Id,Hp和Mana的角色类。分数是通过将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)

4 个答案:

答案 0 :(得分: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)

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

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

答案 1 :(得分:19)

tl; dr

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


您已经正确地说过,MyChar.Score“类下的函数” (又名method)。因此,只需像调用其他函数一样使用它即可:在其后缀一对括号。

print(MyChar.Score())
#                 ^^

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

print(MyChar.Score.__str__())
print(str(MyChar.Score))
print(MyChar.Score.__repr__())
print(repr(MyChar.Score))

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

答案 2 :(得分:7)

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

您可能想查看官方文档,以获取有关Python's object model的更多信息。

答案 3 :(得分:0)

class Character(object):
    def __init__(self):
        print ('Starting')

    def method(self):
        print ('This is a method()')
ch = Character()
'''When we dont add the bracket after the method call it would lead to method bound error as in your case'''
print (ch.method)
'''This can be solved by doing the following line'''
ch.method()