我目前正在学习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)
tl;dr
像其他函数一样使用它:
print(MyChar.Score())
(注意另外一对括号)。在正如您所正确指出的,
MyChar.Score
是类“”(又称“method”)下的一个“函数。所以只要像其他函数一样使用它:用一对圆括号作为后缀。在如果没有调用,只需执行} 魔术方法(或者
^{pr2}$print(MyChar.Score)
将打印<bound method blah blah>
,即方法的非正式字符串表示。print
函数在内部调用^{__repr__()
,如果前者没有定义)。因此,以下打印等效行:在Python中,函数是first-class citizens,因此它们是对象,具有}方法。在
__str__()
和{在Python中,一切都是一个对象,包括类、函数和方法,因此
MyChar.Score
(不带parens)只解析MyChar
对象上的Score
属性。这将产生一个method
对象,它恰好是一个可调用对象(一个实现__call__
特殊方法的对象)。然后必须应用调用运算符(parens)来实际调用它。在有关Python's object model的更多信息,请查看官方文档。在
如果您想像C#中的属性一样使用它,请使用
@property
来装饰函数,如下所示:所以你不必像函数一样调用它。在
有关属性的更高级用法(例如,还具有setter func),请参阅官方文档:https://docs.python.org/3/library/functions.html#property
相关问题 更多 >
编程相关推荐