Python 如何在每次调用类实例时递增

Python 如何在每次调用类实例时递增,python,oop,Python,Oop,我正在用Python学习更多关于OOP的知识,我遇到了一些障碍。下面是我的代码: 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 Playe

我正在用Python学习更多关于OOP的知识,我遇到了一些障碍。下面是我的代码:

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。我尝试了许多不同的方法来解决这个问题;但是每次我尝试一些东西时,程序将只把三个调用作为一个,而不是将三个不同的调用作为一个来计算。感谢您对我的任何帮助

我更喜欢下面的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
,并为它们制作函数

然后像这样称呼它(参见注释):

现在:

产出:

3
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
然后调用它(无需调用,只需键入不带括号的内容):

现在:

产出:

3
3

是的!!,正如预期的那样。

首先,您需要实例化您的类。这实际上意味着根据您在类中定义的计划去构建一个对象(播放器)。只需声明一个新变量,
steve=Player(“steve”)

\uuuu init\uuuu
方法是一种特殊的方法,在创建新对象时自动调用该方法。在这里,您的类只接受一个参数,
name
。所有其他变量(如
hit
)都自动指定为0

如果要更改
hit
的值,应该创建一个函数(也称为方法。然后使用
steve.increment\u hit()
简单地调用此方法

请尝试始终通过调用方法来更改变量的值,而不要直接访问变量本身

例如,使用
steve.increment\u 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
steve.hit
”不是一个“调用”,它只是访问一个属性。它不会执行
\uuuu init\uuuuu
。或者将其作为一个实际的函数调用(例如
steve.hit()
),您可以在其中执行任何您想要的操作,或者将其设置为一个允许您在执行
steve.hit
时简单地执行函数调用的函数。
3
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))
 Hits for 'steve' after instantiate your class: 0

 Hits for player steve: 1
 Hits for player steve: 2
 Hits for player steve: 3