Как увеличивать каждый раз, когда вызывается экземпляр класса - PullRequest
0 голосов
/ 24 октября 2018

Я узнаю больше об ООП в 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 ]

0 голосов
/ 24 октября 2018

Во-первых, вам нужно создать экземпляр класса.Это фактически означает, что нужно пойти и построить объект (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
0 голосов
/ 24 октября 2018

Я бы предпочел следующее для calss:

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

Да !!, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...