Я узнал больше об ООП в Python, и я столкнулся с проблемой. Ниже мой код:
class Player:
bats = 0
hit = 0
freePass = 0
out = 0
defenseError = 0
def __init__(self, name):
self.name = name
Player.hit+=1
Player.freePass+=1
Player.out+=1
Player.defenseError+=1
#--------------------------------
def main():
steve = Player("steve")
steve.hit
steve.hit
steve.hit
#--------------------------------
main()
Как вы можете сказать, я создал класс, который должен увеличивать счетчик каждый раз, когда экземпляр вызывается в основной функции. Например, «steve.hit» вызывается три раза, поэтому счетчик посещений должен увеличиваться до 3. Я пытался найти много разных подходов к этому; но каждый раз, когда я что-то пробую, вместо того, чтобы считать три разных вызова как таковые, программа будет считать только три вызова как один. Спасибо за любую помощь, которую вы можете оказать мне
2 ответа
Я бы предпочел ниже для класса:
class Player:
def __init__(self, name):
self.name = name
self.bats_ = 0
self.hit_ = 0
self.freePass_ = 0
self.out_ = 0
self.defenseError_ = 0
def hit(self):
self.hit_+=1
def freePass(self):
self.freePass_+=1
def out(self):
self.out_+=1
def defenseError(self):
self.defenseError_+=1
Сделайте self
вместо Player
и создайте для них функции,
Тогда назовите это как (см. Комментарии):
def main():
steve = Player("steve") # Create a player
steve.hit() # add 1 to `hit`
steve.hit() # add 1 to `hit` again
steve.hit() # add 1 to `hit` again
return steve.hit_ # to return, use `_hit` because in `__init__`, it's called `hit_`, which is added always
Нво:
print(main())
Выходы:
3
Да, это как и ожидалось.
Или еще лучше @property
:
Итак, класс будет:
class Player:
def __init__(self, name):
self.name = name
self.bats_ = 0
self.hit_ = 0
self.freePass_ = 0
self.out_ = 0
self.defenseError_ = 0
@property
def hit(self):
self.hit_+=1
@property
def freePass(self):
self.freePass_+=1
@property
def out(self):
self.out_+=1
@property
def defenseError(self):
self.defenseError_+=1
Затем вызвать его (не нужно вызывать, просто введите его без скобок):
def main():
steve = Player("steve")
steve.hit
steve.hit
steve.hit
return steve.hit_
Нво:
print(main())
Выходы:
3
Да, это как и ожидалось.
Во-первых, вам нужно создать экземпляр класса. Это фактически означает, что нужно пойти и построить объект (Player) на основе плана, который вы определили в классе. Вы делаете это, просто объявив новую переменную, steve = Player("steve")
Метод __init__
- это специальный метод, который вызывается автоматически при создании нового объекта. Здесь ваш класс принимает только один аргумент, name
. Все остальные переменные, такие как hit
, автоматически присваиваются 0.
Если вы хотите изменить значение hit
, вы должны создать функцию (также известную как метод . Затем вы вызываете этот метод довольно просто с помощью steve.increment_hit()
.
class Player():
"""Class to represent a player."""
def __init__(self, name):
self.name = name
self.hit = 0
self.bats = 0
self.freePass = 0
self.out = 0
self.defenseError = 0
def increment_hit(self):
"""Increase hit count by one when called."""
self.hit += 1
# instantiate your class
steve = Player("steve")
print("Hits for '{}' after instantiate your class: {}\n".format(steve.name, steve.hit))
# call the increase_hit method 3 times
for i in range(3):
steve.increment_hit()
print("Hits for player {}: {}".format(steve.name, steve.hit))
Старайтесь всегда изменять значение переменных, вызывая метод, а не обращаясь непосредственно к самой переменной.
Лучше использовать steve.increment_hit()
, чем, например, обращаться к переменным класса напрямую с помощью steve.hit += 1
.
После запуска приведенного выше кода вы получите такой вывод:
Hits for 'steve' after instantiate your class: 0
Hits for player steve: 1
Hits for player steve: 2
Hits for player steve: 3
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.