python - ¿Cómo uso correctamente una función en una clase?
python-3.x (4)
Actualmente estoy aprendiendo Python. Ya que soy un gran fan de la programación OO (orientada a objetos), obviamente no es difícil aplicarlo en Python. Pero cuando lo probé, parece muy diferente a C #.
Como puede ver a continuación, estoy tratando de crear una clase de personaje, con tres atributos Id, Hp y Mana. La puntuación se calcula sumando Hp y Mana y luego los tiempos 10.
Como puede ver, después de definir MyChar donde
id=10 hp=100 mana=100
, esperaba que
MyChar.Score
(100 + 100) * 10, que es 2000, pero, de manera extraña, dice:
bound method Character.Score of <__main__.Character object at 0x0000021B17DD1F60>
como resultado de la
print(MyChar.Score)
.
¿Como puedo solucionar este problema?
Aquí está mi código:
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)
En Python, todo es un objeto, incluidas clases, funciones y métodos, por lo que
MyChar.Score
(sin el parens) solo resuelve el atributo
Score
en el objeto
MyChar
.
Esto produce un objeto de
method
, que resulta ser un objeto que se puede
__call__
(un objeto que implementa el método especial
__call__
).
A continuación, debe aplicar el operador de llamada (los parens) para llamarlo realmente.
Es posible que desee consultar la documentación oficial para obtener más información sobre el modelo de objetos de Python .
Si quieres usarlo como una propiedad en C #, decora la función con
@property
, así:
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)
Así que no tienes que llamarlo como una función.
Para un uso más avanzado de las propiedades (por ejemplo, tener una función de establecimiento), consulte la documentación oficial: https://docs.python.org/3/library/functions.html#property
tl; dr
Úselo como cualquier otra función llamándolo:
print(MyChar.Score())
(observe el par de paréntesis adicionales).
Como lo has indicado correctamente,
MyChar.Score
es una
"función bajo una clase"
(también conocido como
"
method
"
).
Así que solo úselo como cualquier otra función llamándolo: sufiándolo con un par de paréntesis.
print(MyChar.Score())
# ^^
Sin la llamada, simplemente
print(MyChar.Score)
imprime
<bound method blah blah>
, es decir, la representación informal de la cadena del método.
La función de
print
llama
__str__()
método mágico
__str__()
(o
__repr__()
, si el primero no está definido).
Por lo tanto, las siguientes líneas de impresión equivalentes:
print(MyChar.Score.__str__())
print(str(MyChar.Score))
print(MyChar.Score.__repr__())
print(repr(MyChar.Score))
En Python, las funciones son
ciudadanos de primera clase
, por lo tanto, son objetos y tienen los
__str__()
y
__repr__()
.
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()