我目前正在学习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
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__()方法。
在Python中,一切都是对象,包括类,函数和方法,因此MyChar.Score(不带括号)只能解析对象的Score属性MyChar。这将产生一个method对象,该对象恰好是可调用对象(实现__call__特殊方法的对象)。然后,您必须应用调用运算符(paren)来实际调用它。
您可能需要查看官方文档,以获取有关Python对象模型的更多信息。
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |