Я узнал больше об ООП в 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. Я пытался найти много разных подходов к этому; но каждый раз, когда я что-то пробую, вместо того, чтобы считать три разных вызова как таковые, программа будет считать только три вызова как один. Спасибо за любую помощь, которую вы можете оказать мне

0
macaato 24 Окт 2018 в 03:48

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

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

3
U10-Forward 24 Окт 2018 в 01:05

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