我正在学习有关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()
您可以说,我创建了一个类,该类应该在每次在main函数中调用一个实例时都增加一个计数器。例如,“ steve.hit”被称为三个不同的时间,因此,命中计数器应增加到3。但是每次我尝试尝试某些事情时,程序不会将这三个不同的调用计为一个,而是将这三个调用计为一个。谢谢您能给我的任何帮助
答案 0 :(得分:3)
我更喜欢以下内容:
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
是的,正如预期的那样。
答案 1 :(得分:0)
第一件事,您需要实例化您的课程。这实际上意味着根据您在类中定义的计划去构建对象(播放器)。您只需声明一个新变量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