python python-3.x

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()