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